问题描述
我正在使用带角度的asp net core 3.1,我想将Windows身份验证和JWT结合使用,以便在路由和授权控制器时可以在角度激活,但是在我将令牌从拦截器传递到控制器时始终需要Windows用户名和密码>
request.clone({ headers: request.headers.set('Authorization','Bearer ' + user.token) });
我的launchSettings.json更改为以下
"windowsAuthentication": true,"anonymousAuthentication": false,
将以下代码添加到启动ConfigureConfigs
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
// configure jwt authentication
var appSettings = appSettingsSection.Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(key),ValidateIssuer = false,ValidateAudience = false
};
});
将以下代码添加到启动配置
app.UseAuthentication();
app.UseAuthorization();
解决方法
如果要在IIS上托管应用程序,则几乎无法将Windows和jwt令牌认证结合在一起。 JWT和Windows身份验证都利用Http Request Header中的Authorization标头,但是IIS首先接管它,当您的请求是JWT请求时,您发送的Authorization标头就是这样
Authorization: Bearer {jwtcontent}
然后iis Windows身份验证模块接管了您的请求,发现它无法识别您的Authorization标头,因此它以401和类似于(协商)的Authorization标头来响应您的请求
Authorization: Negotiate YIIg8gYGKwY[...]hdN7Z6yDNBuU=
或(对于NTLM)
Authorization: NTLM TlRMTVN[...]ADw==
您的浏览器收到此响应,发现服务器正在寻找Windows凭据,因此它弹出一个窗口,要求您输入用户名和密码
所有这些都由IIS和浏览器处理,甚至都没有转到您的应用程序代码中。