首页 > 解决方案 > 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();

标签: angularasp.net-core

解决方案


如果您在 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 和浏览器处理,甚至不会进入您的应用程序代码。


推荐阅读