身份验证失败时返回自定义状态代码 .Net Core

时间:2021-07-19 17:02:35

标签: asp.net-core authentication .net-core

我在 .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,因为响应已经开始。

我可以“忽略”异常,但我宁愿找到某种方式来做到这一点,该方法得到更清晰的支持,这样我就不会用这些异常将日志弄乱。

是否有其他方法可以更改身份验证失败后返回的响应?

0 个答案:

没有答案