C# 如何返回状态代码401以及一些附加数据?

C# 如何返回状态代码401以及一些附加数据?,c#,authentication,asp.net-core,C#,Authentication,Asp.net Core,我正在尝试编写一个自定义Authorize属性来授权一些API端点和MVC操作。在这个StackOverflow之后,我编写了一个自定义属性。我正在使用UnauthorizedResult返回401 对于Web API,如何返回状态代码401或403以及 作为JSON负载的附加消息 对于返回的MVC操作 HTML,如何返回状态码401或403并重定向到不同的URL 如何检查请求是WebAPI还是MVC 行动 回答您的第一个问题,这就是被重写的授权属性方法的外观。错误消息将是状态消息,内容在响应正

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

  • 对于Web API,如何返回状态代码401或403以及 作为JSON负载的附加消息
  • 对于返回的MVC操作 HTML,如何返回状态码401或403并重定向到不同的URL
  • 如何检查请求是WebAPI还是MVC 行动

  • 回答您的第一个问题,这就是被重写的授权属性方法的外观。错误消息将是状态消息,内容在响应正文中

    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);
    }
    
    AuthorizationAsync(HttpActionContext actionContext,System.Threading.CancellationToken CancellationToken)上的公共重写任务 { string errorMessage=“用户没有足够的权限执行请求的操作。”; var httpContent=newstringcontent(“{\'some\':\'json\'”),Encoding.UTF8,“application/json”); actionContext.Response=新的HttpResponseMessage(HttpStatusCode.Forbidden) { ReasonPhrase=errorMessage, Content=httpContent }; 返回Task.FromResult(空); }
    从MVC操作中,您可以像下面这样返回状态代码
    returnstatuscode(418)
    或使用专用方法,如
    返回Unauthorized()。要重定向,您可以使用或

    一个适用于ASP.NET核心的更现代的响应,至少是

    public async Task<IActionResult> CtrlAction()
    {
        ...
        var result = // whatever object you want
        return StatusCode((int) HttpStatusCode.Unauthorized, result);
    }
    
    公共异步任务CtrAction()
    {
    ...
    var result=//您想要的任何对象
    返回状态码((int)HttpStatusCode.Unauthorized,result);
    }
    
    我发现建议更简单。这将设置内容,而不是推理短语,这更适用于额外的异常信息消息