1

我正在将一个简单的 Web 应用程序和关联的 Web API 转换为使用从 .Net Framework 4.6.2 到 .Net Core 2.0 的开放 ID 使用本地 ADFS 保护的,但在 Web API 中遇到身份验证问题。

我已成功将前端 Web 应用程序转换为 .Net Core,并且它调用旧 API 没有任何问题。但是我不确定如何为承载身份验证配置新的 API。

现有 API 中的身份验证配置如下:

public void ConfigureAuth(IAppBuilder app)
        {
            JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
            app.UseActiveDirectoryFederationServicesBearerAuthentication(
                new ActiveDirectoryFederationServicesBearerAuthenticationOptions
                {
                    MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                    TokenValidationParameters = new TokenValidationParameters() {
                        SaveSigninToken = true,
                        ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                    }
                });
        }

我试图在新的 API 中配置身份验证,如下所示:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddAuthentication(options =>
                {
                    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(options =>
                {
                    options.MetadataAddress = "xxx/adfs/.well-known/openid-configuration";
                    options.Authority = "xxx/adfs/";
                    options.TokenValidationParameters = new TokenValidationParameters
                    {

                        SaveSigninToken = true,
                        ValidAudiences = new List<string>
                        {
                            Configuration["http://localhost:64766/"],
                            Configuration["http://localhost:53797/"]
                        }
                    };
                });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
            app.UseAuthentication();
        }

调用旧 API 时,不记名令牌被成功解析并被授予访问权限,没有任何问题。但是,在调用新 API 时,我只是收到 401 错误。如果我[Authorize]从 API 控制器中删除该属性,则请求成功,但没有与请求关联的用户,尽管我可以在授权标头中看到不记名令牌。知道我错过了什么吗?

编辑

我现在已经连接到 JwtBearer 事件,所以我可以看到出了什么问题,结果证明我的配置中有几个错误,它无法验证我的令牌的受众和发行者。将代码更新到以下解决了该问题。

options.TokenValidationParameters = new TokenValidationParameters
                    {

                        SaveSigninToken = true,
                        ValidIssuer = "xxx/adfs/services/trust",
                        ValidAudiences = new List<string>
                        {
                            "http://localhost:64766/",
                            "http://localhost:53797/"
                        },
                    };

现在,当我调用 API 时,我可以看到OnTokenValidated正在引发事件并且用户主体正确且经过身份验证,但是在调用 API 时我仍然收到 401 未经授权的错误。如果我[Authorize]从 API 中删除该属性,它可以工作,但没有用户主体。

4

0 回答 0