混合 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
djangorestframework-jwt 未提供身份验证凭据
混合护照-facebook和passport-jwt的最佳方法是什么?
将 Spring websockets (sockJS + Stomp) 与基于令牌的身份验证 (JWT) 一起使用的最佳方法