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:
IActionResult不是一种方式.从一方面来看它不是类型安全的,并且不允许为我的API生成C#和Typescript客户端(现在我正在使用NSwag用于此目的)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)
你可能会返回这样的东西:
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 核心引入了授权策略。在此处阅读更多相关信息。
| 归档时间: |
|
| 查看次数: |
13844 次 |
| 最近记录: |