如何解决asp net core 3.1角Windows身份验证所需的用户名和密码
我正在使用带角度的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和浏览器处理,甚至都没有转到您的应用程序代码中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。