身份服务器 4 - /signin-oidc

如何解决身份服务器 4 - /signin-oidc

我们最近向 Azure 应用服务分别发布了两个 Web 应用。 Identity Server 4 应用程序和 .Net Core 3.1 Web 应用程序,它是 Identity Server 的客户端。通过 IIS/Visual Studio 在本地运行这些可以正常工作。我可以通过 Identity Server 登录我的客户端应用程序并重定向回来。

但是,将两个项目发布到 Azure 时,我收到以下错误消息。

Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectMessage..ctor(string json)

OpenIdConnectProtocolException:无法将令牌响应正文解析为 JSON。状态代码:500。内容类型:文本/纯文本 Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.RedeemAuthorizationCodeAsync(OpenIdConnectMessage tokenEndpointRequest)

异常:处理远程登录时遇到错误。 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync()

我将在下面发布身份服务器和客户端项目的代码。任何有关该问题的帮助将不胜感激。

Identity.Startup:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddMvc(options =>
        {
            options.EnableEndpointRouting = false;
        })
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });

        // Add Data GoCVContext
        string GoCVDataConnectionString = EnvironmentHandler.WebDB;
        services.AddDbContext<GoCVContext>(options => options.UseLazyLoadingProxies().UseSqlServer(GoCVDataConnectionString));

        // Add Identity context
        string IdentityConnectionString = EnvironmentHandler.IdentityDB;
        var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

        services.AddDbContext<IdentityContext>(options =>
        {
            options.UseSqlServer(IdentityConnectionString,sql => sql.MigrationsAssembly(migrationsAssembly));
        });

        services.AddIdentity<ApplicationUser,IdentityRole>(options =>
        {
            // password config
            options.Password.RequireDigit = true;
            options.Password.RequiredLength = 8;
            options.Password.RequireNonAlphanumeric = true;
            options.Password.RequireUppercase = true;
            options.Password.RequireLowercase = true;

            // lockout config
            options.Lockout.AllowedForNewUsers = true;
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
            options.Lockout.MaxFailedAccessAttempts = 5;

            // sign in options
            options.SignIn.RequireConfirmedEmail = true;

            // add custom class for email tokens
            options.Tokens.EmailConfirmationTokenProvider = "CustomEmailConfirmation";
        })
            .AddEntityFrameworkStores<IdentityContext>()
            .AddDefaultTokenProviders()
            .AddTokenProvider<CustomEmailConfirmationTokenProvider<ApplicationUser>>("CustomEmailConfirmation");
        

        // set lifespan of all tokens used
        services.Configure<DataProtectionTokenProviderOptions>(options =>
        {
            options.TokenLifespan = TimeSpan.FromDays(1);
        });
        // set life span for email confirmation token
        services.Configure<CustomEmailConfirmationTokenProviderOptions>(options =>
        {
            options.TokenLifespan = TimeSpan.FromDays(30);
        });

        var builder = services.AddIdentityServer(options =>
        {
            options.Events.RaiseErrorEvents = true;
            options.Events.RaiseInformationEvents = true;
            options.Events.RaiseFailureEvents = true;
            options.Events.RaiseSuccessEvents = true;

            options.UserInteraction.LoginUrl = "/Identity/Account/Login";
            options.UserInteraction.LogoutUrl = "/Identity/Account/Logout";

            options.Authentication = new AuthenticationOptions()
            {
                CookieLifetime = TimeSpan.FromHours(10),// ID server cookie timeout set to 10 hours
                CookieSlidingExpiration = true
            };
        })
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = b => b.UseSqlServer(IdentityConnectionString,sql => sql.MigrationsAssembly(migrationsAssembly));
            })
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext = b => b.UseSqlServer(IdentityConnectionString,sql => sql.MigrationsAssembly(migrationsAssembly));
                options.EnableTokenCleanup = true;
            })
            .AddAspNetIdentity<ApplicationUser>()
            .AddProfileService<ProfileService>();

        services.AddLocalApiAuthentication();

        services.AddAuthentication("Bearer")
        .AddJwtBearer("Bearer",options =>
        {
            options.Authority = https://our_identity_server_url;

            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateAudience = false
            };
        });

        services.AddTransient<IProfileService,ProfileService>();

        // not recommended for production - you need to store your key material somewhere secure
        builder.AddDeveloperSigningCredential();
        }

        public void Configure(IApplicationBuilder app)
        {
        InitializeDatabase(app);

        var forwardOptions = new ForwardedHeadersOptions
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,RequireHeaderSymmetry = false
        };

        app.UseForwardedHeaders(forwardOptions);

        if (Environment.IsDevelopment() || Environment.IsProduction())
        {
            app.UseDeveloperExceptionPage();
        }

        // uncomment if you want to add MVC
        app.UseStaticFiles();
        app.UseRouting();

        app.UseIdentityServer();

        app.UseAuthorization();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
            name: "areas",template: "{area:exists}/{controller=Home}/{action=Index}");

            routes.MapRoute(
            name: "default",template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

客户端配置:

                new Client
                {
                    ClientId = "Our client Id",ClientName = "Our client name",ClientSecrets = { new Secret("oursecret".Sha256()) },AllowedGrantTypes = GrantTypes.CodeAndClientCredentials,AllowedCorsOrigins =
                    {
                        "https://our_client_app_url"
                    },RedirectUris = { "https://our_client_app_url/signin-oidc" },PostLogoutRedirectUris = { "https://our_client_app_url/signout-callback-oidc" },AllowedScopes = new List<string>
                    {
                        IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile,IdentityServerConstants.StandardScopes.Email,JwtClaimTypes.Role
                    }
                }

客户端网络应用。启动

public void ConfigureServices(IServiceCollection services)
        {
            EnvironmentHandler.Init(_configuration,environment);
            
            services.AddControllersWithViews();
            services.AddMvc().AddNewtonsoftJson();

            services.AddMvc(options => options.EnableEndpointRouting = false);
            services.AddSingleton<IActionContextAccessor,ActionContextAccessor>();
            services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>();

            services.AddRazorPages();
            services.Configure<RazorPagesOptions>
                (options => options.RootDirectory = "/Views/Home");

            string dbConnectionString = EnvironmentHandler.WebDB;
            services.AddDbContext<GoCVContext>(options => options.UseLazyLoadingProxies().UseSqlServer(dbConnectionString));

            JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc",options =>
            {
                options.Authority = "https://our_identity_server_url";
                options.ClientId = "our client Id";
                options.ClientSecret = "our secret";
                options.ResponseType = "code";
                options.SaveTokens = true;

                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("profile");

                options.Scope.Add("roles");
                options.ClaimActions.MapUniqueJsonKey("role","role");
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    RoleClaimType = "role"
                };
            });

            services.AddHttpContextAccessor();

        }

        public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
        {
            using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetRequiredService<GoCVContext>();
                context.Database.Migrate();
            }

            app.UseForwardedHeaders();

            if (env.IsDevelopment() || env.IsProduction())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Views/Shared/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios,see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                name: "areas",template: "{area:exists}/{controller=Home}/{action=Index}");

                routes.MapRoute(
                name: "default",template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-