我在 .Net 核心中有一个自定义身份验证方案,我想在其中为某些特定类型的身份验证失败返回特定响应(而不是仅返回 401)。我目前的方法看起来像这样:
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var token = GetToken();
if (string.IsNullOrWhiteSpace(token))
{
return AuthenticateResult.NoResult();
}
var validationResult = _tokenContextProvider.Validate(); // validate
if (validationResult != TokenValidationResult.Ok)
{
await updateResponseCode(Context, validationResult);
return AuthenticateResult.Fail("Token invalid");
}
//success
var userContext = tokenContextProvider.GetUserContext();
var ticket = GetAuthenticationTicket(userContext);
return AuthenticateResult.Success(ticket);
}
private static async Task updateResponseCode(HttpContext context, TokenValidationResult validationResult)
{
if (!context.Response.HasStarted)
{
if (validationResult == TokenValidationResult.SpecialError)
{
context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
var errorMessage = JsonConvert.SerializeObject(new
{
error = new
{
message = validationResult.Message
}
});
context.Response.Headers["Content-Type"] = "application/json";
await context.Response.WriteAsync(errorMessage, Encoding.UTF8);
}
}
}
这很好,并返回我想要的响应代码。但是,另一位中间件(我假设)然后尝试在之后设置 StatusCode
并导致记录一些异常。
ThrowResponseAlreadyStartedException 中的 Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext
<块引用>System.InvalidOperationException:无法设置 StatusCode,因为响应已经开始。
我可以“忽略”异常,但我宁愿找到某种方式来做到这一点,该方法得到更清晰的支持,这样我就不会用这些异常将日志弄乱。
是否有其他方法可以更改身份验证失败后返回的响应?