【发布时间】:2021-09-27 08:19:47
【问题描述】:
我在 .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 并导致记录一些异常。
Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext in ThrowResponseAlreadyStartedException
System.InvalidOperationException:无法设置 StatusCode,因为响应已经开始。
我可以“忽略”异常,但我宁愿找到一些更清晰支持的方法来执行此操作,这样我就不会因为这些异常而使日志混乱。
是否有其他方法可以更改身份验证失败后返回的响应?
【问题讨论】:
-
这不是身份验证方案的责任。通常的方法是提供可以在身份验证配置期间挂钩的事件。见
CookieAuthenticationHandler:source.dot.net/#Microsoft.AspNetCore.Authentication.Cookies/… -
您找到解决方案了吗?
-
@MightyAtom 我确实找到了解决方案。我会发布我最终做了什么
标签: c# asp.net-core authentication .net-core