加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何从.Net Core Web API返回Unathorized

发布时间:2020-12-15 19:47:47 所属栏目:百科 来源:网络整理
导读:我有简单的API控制器,我确实需要返回401. 方法的返回类型不是IActionResult所以我不能只返回Unauthorized() 在这种情况下如何归还未经授权的人? [Produces("application/json")]public class MyController : Comntroller{ public SomeData GetSomeData([Fro
我有简单的API控制器,我确实需要返回401.
方法的返回类型不是IActionResult所以我不能只返回Unauthorized()

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

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

UPD:

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

解决方法

如果你没有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(){

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读