【问题标题】:How to return Unathorized from .Net Core Web API如何从 .Net Core Web API 返回 Unathorized
【发布时间】:2017-09-13 04:34:06
【问题描述】:

我确实有简单的 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. 关于检查访问条件的一些更新 - 我确实需要检查授权用户是否有权使用请求数据进行操作。因此,对于使用一些“类似授权”的属性,最好在反序列化请求数据后进行检查(再次避免双重反序列化 - 因为性能)

【问题讨论】:

  • 请查看this
  • 创建一个操作过滤器来检查您的访问条件并在全球范围内应用它。从中返回 401 而不是控制器操作。
  • 为什么返回类型不是IActionResult?
  • 如果是未经授权的,你还想返回json吗?
  • 在最新版本中你现在可以做ActionResult<SomeData>

标签: c# asp.net asp.net-core


【解决方案1】:

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

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

有点笨拙,但您也可以简单地返回 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(){

【讨论】:

  • 我确实返回了具体的数据类型,因为从一方面来说它是类型安全的,例如,我可以使用 NSwag 轻松地为我的 API(c# 和 typescript)生成客户端。所以我不想使用IActionResult。使用MyAccess 是一种方法,但并不容易,因为我确实需要检查当前用户和方法数据...
  • 您仍然可以检查当前用户和方法数据,基本上可以检查控制器内部的任何内容。但这仅在用户登录并且检查始终与用户数据相关时吗?因为在这种情况下,还有另一种方法可以遵循
【解决方案2】:

您可能会返回如下内容:

return StatusCode(statusCode);

return Unauthorized();

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

示例:

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

ASP.NET 核心引入了授权策略。阅读更多关于它的信息here

【讨论】:

  • 这是 WCF 文档的链接?
  • @KeithNicholas 哎呀。更正了链接。谢谢!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 2020-08-05
    • 2020-09-07
    • 1970-01-01
    • 2021-10-29
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多