Как вернуть значение вместо статуса, если запрос не авторизован? - PullRequest
2 голосов
/ 01 августа 2020
[authorise]
public string Get()
{
    return "value1";
}

, если я не авторизован , он вернет статус 401 не авторизован .

может ли он вернуть такое значение, как json " {status:false,code:"401"} ". ?

Ответы [ 4 ]

1 голос
/ 03 августа 2020

Согласно вашему описанию, я предлагаю вам попробовать использовать custommiddleware для достижения ваших требований.

Вы можете зафиксировать ошибку 401 в промежуточном программном обеспечении, а затем переписать тело ответа на {status:false,code:"401"}

Для получения дополнительной информации вы можете добавить приведенные ниже коды в метод настройки над app.UseAuthentication();:

        app.Use(async (context, next) =>
        {
            await next();
            if (context.Response.StatusCode == 401)
            {
                await context.Response.WriteAsync("{status:false,code:'401'}");
            }
        });

Результат:

введите описание изображения здесь

1 голос
/ 01 августа 2020

может ли он вернуть такое значение, как json "{status:false,code:"401"}". ?

Конечно, можете.

[ApiController]
[Produces("application/json")]
public class TestController : ControllerBase
{
    public IActionResult Get()
    {
        if (User.Identity.IsAuthenticated) 
        { 
            return new OkObjectResult(new { status: true, code: 200 });
        }
        return new OkObjectResult(new { status: false, code: 401 });
    }
}

Но обратите внимание, что запрос вернется с кодом состояния real 200 (OK)

Вы также можете использовать UnauthorizedObjectResult как комментарий @ vivek:

return new UnauthorizedObjectResult(new { status: false, code: 401 });
0 голосов
/ 01 августа 2020

Вы можете вернуть следующее, если используете Asp. Net Core 3.1, он возвращает UnauthorizedObjectResult.

return Unauthorized(new { status: false, code: 401 });
0 голосов
/ 01 августа 2020

Вы можете создать настраиваемый атрибут авторизации, используя IAsyncAuthorizationFilter.

public class CustomAuthorizeFilter : IAsyncAuthorizationFilter
{
    public AuthorizationPolicy Policy { get; }

    public CustomAuthorizeFilter(AuthorizationPolicy policy)
    {
        Policy = policy ?? throw new ArgumentNullException(nameof(policy));
    }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        // Allow Anonymous skips all authorization
        if (context.Filters.Any(item => item is IAllowAnonymousFilter))
        {
            return;
        }

        var policyEvaluator = context.HttpContext.RequestServices.GetRequiredService<IPolicyEvaluator>();
        var authenticateResult = await policyEvaluator.AuthenticateAsync(Policy, context.HttpContext);
        var authorizeResult = await policyEvaluator.AuthorizeAsync(Policy, authenticateResult, context.HttpContext, context);

        if (authorizeResult.Challenged)
        {
            // Return custom 401 result
            context.Result = new CustomUnauthorizedResult("Authorization failed.");
        }
        else if (authorizeResult.Forbidden)
        {
            // Return default 403 result
            context.Result = new ForbidResult(Policy.AuthenticationSchemes.ToArray());
        }
    }
}

public class CustomUnauthorizedResult : JsonResult
{
    public CustomUnauthorizedResult(string message)
        : base(new CustomError(message))
    {
        StatusCode = StatusCodes.Status401Unauthorized;
    }
}

public class CustomError
{
    public string Error { get; }

    public CustomError(string message)
    {
        Error = message;
    }
} 

Код в этой статье делает именно то, что вы хотите. нажмите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...