我想在 IIS 上使用 JWT 和 Windows 身份驗證。在 IIS 上,我啟用了 Windows 和匿名授權。我配置了自定義 jwt auth:
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)]
我添加了 auth 和 autorization 中間件:
app.UseAuthentication();
app.UseAuthorization();
但是在我回傳后,AuthenticateResult.NoResult()該HandleAuthenticateAsync方法再次被呼叫。然后彈出Windows授權。
我原以為 401 代碼會回來。
為什么在 JWT 之后呼叫 Windows 授權?
JWT授權失敗后如何獲得401?
uj5u.com熱心網友回復:
根據這個問題,你可以發現PG已經回復了:
這在 IIS 中可能是不可能的。IIS 將向任何帶有 401 狀態代碼的回應添加 Windows 身份驗證質詢,從而觸發登錄提示。這發生在 ASP.NET 和您的應用程式之外,此時您沒有太多控制權。它應該與 HttpSysServer 一起使用,因為它都在行程中受到控制。
所以當 jwt 失敗時你不應該回傳 401。您應該回傳其他狀態碼,它不會觸發 600 之類的登錄提示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/317586.html
