簡體   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