繁体   English   中英

如何从 .Net Core Web API 返回 Unathorized

[英]How to return Unathorized from .Net Core Web API

我有简单的 API 控制器,我确实需要返回 401。方法的返回类型不是IActionResult所以我不能只return Unauthorized()

在这种情况下,我如何返回 Unauthorized?

[Produces("application/json")]
public class MyController : Comntroller
{
    public SomeData GetSomeData([FromBody]RequestData data)
    {
        if(!CheckAccessCondition(data, GetCurrentUser()))
            // ?? how to return from here 401
        ///
    }
}

更新

  1. 使用IActionResult不是一种方法。 一方面它不是类型安全的,并且不允许为我的 API 生成 C# 和 Typescript 客户端(现在我为此使用 NSwag)
  2. 避免因为性能而抛出异常会很棒(抛出异常是非常昂贵的操作)
  3. 关于检查访问条件的一些更新 - 我确实需要检查授权用户是否有权操作请求数据。 因此,对于使用一些“类似授权”的属性,最好在请求数据反序列化后进行检查(再次避免双重反序列化 - 因为性能)

如果您没有 IActionResult 返回类型的唯一原因是因为您想返回 json 数据,您仍然可以返回它并执行以下操作:

public IActionResult GetSomeData()
{
    if (condition) 
      return Json(myData);
    else 
      return Unauthorized();
}

有点 hacky,但您也可以简单地返回 null 并使用HttpContext配置您的响应

public SomeData GetSomeData()
{
    if (condition) return myData;
    else 
    {
        HttpContext.Response.StatusCode = 401;
        return null;
    }

}

如果出于某种原因(例如类型安全)需要SomeData ,您的选择之一是设置过滤器类。

public class MyAccessAttribute : Attribute, IActionFilter{

    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (condition)
            context.Result = new UnauthorizedResult();
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
    }
}

然后你可以像这样在你的动作中使用它:

[MyAccess]
public SomeData GetSomeData(){

更新从 .netcore 2.1 开始,您现在可以使用通用 ActionResult

 public ActionResult<SomeData> GetSomeData(){

你可能会返回这样的东西:

return StatusCode(statusCode);

return Unauthorized();

由于StatusCode()Unauthorized()返回 ActionResult,因此您需要将操作的返回类型更改为IActionResult (这意味着您需要将实际值返回为Ok(yourValue) )。

示例:

public IActionResult GetSomeData()
{
    if(!CheckAccessCondition())
        return Unauthorized();
    return Ok(somevalue);
}

ASP.NET 核心引入了授权策略。 在此处阅读更多相关信息。

从逻辑上讲,您必须首先更改方法的返回类型。 然后你可以处理它如下:

public IActionResult GetSomeData()
{
    if(!CheckAccessCondition()) return HttpUnauthorized();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM