混合 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 失败后弹出凭据的主要内容,如果未能解决你的问题,请参考以下文章

混合身份验证 - 基于 Spring MVC 会话 + 基于 JWT 令牌

具有混合身份验证 JWT 和 SAML 的 ASP.NET Web API 2.2 OWIN

Spring Boot JWT 身份验证

djangorestframework-jwt 未提供身份验证凭据

混合护照-facebook和passport-jwt的最佳方法是什么?

将 Spring websockets (sockJS + Stomp) 与基于令牌的身份验证 (JWT) 一起使用的最佳方法