如何从.Net Core Web API返回Unathorized

ili*_*ili 4 c# asp.net asp.net-core

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

在这种情况下如何归还未经授权的人?

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

UPD:

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

Nev*_*ane 16

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

public IActionResult GetSomeData(){
    if (condition) return Json(myData);
    else return Unauthorized();
}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

如果SomeData由于某些原因需要安全类型,您可以选择设置过滤器类.

public class MyAccessAttribute : Attribute, IActionFilter{

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

    public void OnActionExecuted(ActionExecutedContext context)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在此操作中使用它:

[MyAccess]
public SomeData GetSomeData(){
Run Code Online (Sandbox Code Playgroud)

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

 public ActionResult<SomeData> GetSomeData(){
Run Code Online (Sandbox Code Playgroud)


gld*_*ael 5

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

return StatusCode(statusCode);
Run Code Online (Sandbox Code Playgroud)

或者

return Unauthorized();
Run Code Online (Sandbox Code Playgroud)

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

例子:

public IActionResult GetSomeData()
{
    if(!CheckAccessCondition())
        return Unauthorized();
    return Ok(somevalue);
}
Run Code Online (Sandbox Code Playgroud)

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