angular - asp net core 3.1 angular 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,
将以下代码添加到启动 ConfigureServices
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 和浏览器处理,甚至不会进入您的应用程序代码。
推荐阅读
- java - 如何正确配置 Log4J?
- angular - 行为主体在值变化时具有不同的发射计数
- oracle - Oracle 序列不匹配
- javascript - Leaflet Realtime:将geoJSON数据存储在变量中
- amazon-s3 - 如何通过 CLI 将目录与 KMS ID 一起上传到 AWS S3 存储桶?
- localtunnel - Localtunnel运行问题,根本不起作用
- python - 有没有办法对数据框中的索引级别求和,同时保留重复的索引级别?
- ios - 如何使用 Swift 为 JSON 数据创建 JSON Codable 和 Decodable?
- c++ - Eigen:我应该使用对齐的地图进行密集计算吗?
- mongodb - 无法在 Ubuntu 系统中运行 MongoDB 服务器