如何沿着一些额外的数据返回状态代码401?

时间:2018-02-22 18:23:19

标签: c# authentication asp.net-core

我正在尝试编写自定义Authorize属性来授权某些API端点和MVC操作。在这个StackOverflow answer之后,我编写了一个自定义属性。我使用UnauthorizedResult返回401.

  1. 对于Web API,如何返回状态代码401或403 一些额外的消息作为JSON有效负载?
  2. 对于返回的MVC操作 HTML,如何返回状态代码401或403并重定向到不同的URL?
  3. 如何检查请求是否为WebAPI或MVC 动作?

2 个答案:

答案 0 :(得分:1)

回答您的第一个问题,这是覆盖的授权方法属性的样子。错误消息将是状态消息,内容在响应正文中。

public override Task OnAuthorizationAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
{
    string errorMessage = "User has no enough permissions to perform requested operation.";

    var httpContent = new StringContent("{ \"some\": \"json\"}", Encoding.UTF8, "application/json");

    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden)
    {
        ReasonPhrase = errorMessage,
        Content = httpContent
    };

    return Task.FromResult<object>(null);
}

从MVC操作中,您可以返回状态代码,例如return StatusCode(418);或使用return Unauthorized();等专用方法。要重定向,您可以使用RedirectToActioncontext.Response.Redirect

答案 1 :(得分:0)

至少适用于ASP.NET Core的更现代的响应是

public async Task<IActionResult> CtrlAction()
{
    ...
    var result = // whatever object you want
    return StatusCode((int) HttpStatusCode.Unauthorized, result);
}