混合 JWT 和 Windows 身份验证。 jwt 失败后弹出凭据

Posted

技术标签:

【中文标题】混合 JWT 和 Windows 身份验证。 jwt 失败后弹出凭据【英文标题】:Mixed JWT and windows authentication. Credentials popup after jwt failed 【发布时间】:2021-12-03 00:36:07 【问题描述】:

我想在 IIS 上使用 JWT 和 Windows 身份验证。 在 IIS 上,我启用了 Windows 和匿名授权。 我配置了自定义 jwt 身份验证:

services.AddAuthentication(options =>

    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddScheme<BearerAuthenticationSchemeOptions, BearerAuthenticationHandler>(JwtBearerDefaults.AuthenticationScheme, null);
public class BearerAuthenticationHandler
    : AuthenticationHandler<BearerAuthenticationSchemeOptions>

    private IJwtUtils _jwtUtils;
    public BearerAuthenticationHandler(
        IOptionsMonitor<BearerAuthenticationSchemeOptions> options,
        ILoggerFactory logger,
        UrlEncoder encoder,
        ISystemClock clock,
        IJwtUtils jwtUtils)
        : base(options, logger, encoder, clock)
    
        _jwtUtils = jwtUtils;
    

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    
        //if (HasAnonymousAttribute())
        //
        //    return Task.FromResult(AuthenticateResult.NoResult());
        //

        var token = Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
        var user = _jwtUtils.ValidateJwtToken(token);

        if (user != null)
        
            var ticket = new AuthenticationTicket(user, this.Scheme.Name);
            return AuthenticateResult.Success(ticket);
        


        return AuthenticateResult.NoResult(); 
    

我用属性标记了控制器中的方法:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

我添加了身份验证和自动化中间件:

app.UseAuthentication();
app.UseAuthorization();

但是在我返回AuthenticateResult.NoResult() 之后,HandleAuthenticateAsync 方法又被调用了。然后弹出 Windows 授权。 我原以为 401 代码会回来。

为什么在 JWT 之后调用 Windows 授权? JWT授权失败后如何得到401?

【问题讨论】:

您确定要返回NoResult()吗?在我看来,您应该让请求失败 是的。如果抛出异常,我认为 Fail 应该是。 【参考方案1】:

根据这个issue,你可以发现PG已经回复了:

这在 IIS 中可能是不可能的。 IIS 将添加 Windows 身份验证挑战 对任何带有 401 状态代码的响应,触发登录提示。 这发生在 ASP.NET 和您的应用程序之外,您没有 那时有很多控制权。它应该与 HttpSysServer 一起工作,因为它都是在进程中控制的。

所以当 jwt 失败时你不应该返回 401。应该返回其他状态码,不会触发600这样的登录提示。

【讨论】:

以上是关于混合 JWT 和 Windows 身份验证。 jwt 失败后弹出凭据的主要内容,如果未能解决你的问题,请参考以下文章