我正在将一个简单的 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 中删除该属性,它可以工作,但没有用户主体。