C# 如何在ASP.NET内核中返回403禁止响应作为IActionResult

C# 如何在ASP.NET内核中返回403禁止响应作为IActionResult,c#,asp.net-core,C#,Asp.net Core,当尝试执行无效操作时,我想向客户端返回403禁止。我需要用什么方法 我在互联网上搜索过,但我只找到了这些MVC 5: 如果web api方法的返回类型为HttpResponseMessage,则 您需要使用以下代码: return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "RFID is disabled for this site."); Or if the return type for your web api meth

当尝试执行无效操作时,我想向客户端返回403禁止。我需要用什么方法

我在互联网上搜索过,但我只找到了这些MVC 5:

如果web api方法的返回类型为HttpResponseMessage,则 您需要使用以下代码:

return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "RFID is disabled for this site.");
Or  if the return type for your web api method is IHttpActionResult then you need to use the below code

return StatusCode(HttpStatusCode.Forbidden,"RFID is disabled for this site.");
如何为IActionResult类型返回403:

public IActionResult Put(string userid, [FromBody]Setting setting)
 {
    var result = _SettingsRepository.Update(userid, setting);
    if (result == true)
    {
       return Ok(201);
    }
    else
    {
       return BadRequest();
    }
 }

您可以使用
返回新结果()类声明是

public class ForbidResult : ActionResult, IActionResult

欲了解更多特殊用法,请访问

MstfAsan的答案是使用:

return Forbid();
它是控制器基类上执行相同操作的方法


如果要返回消息,则当您希望以HTTP 403状态响应并允许ASP.NET Core的身份验证逻辑以其禁止的处理逻辑(可在
启动
类中配置,并可能导致重定向到另一页)处理响应时,必须使用
StatusCode

,使用:

(这同样适用于
未经授权()



如果您希望使用API中的HTTP 403状态代码进行响应,并且不希望ASP.NET核心身份验证逻辑执行任何重定向或其他操作,请使用:

return StatusCode(403);

如果不返回
ActionResult
进行响应,可以使用以下代码:

public List<SomeModel> get()
{
   ... 
   ... // check logic
   ...

   Response.StatusCode = 403;
   return new List<SomeModel>();
}
公共列表get()
{
... 
…//检查逻辑
...
Response.StatusCode=403;
返回新列表();
}

只需使用ObjectResult返回带有状态代码的自定义响应即可

参见语法

return new ObjectResult("Message") {StatusCode = YOUR_STATUS_CODE };
注意- 你也可以传递一个对象

return new ObjectResult(your_model) {StatusCode = YOUR_STATUS_CODE };
示例:

public async Task<IActionResult> Post([FromBody] SomeData _data)
{
     // do your stuff

    // return forbidden with custom message
    return new ObjectResult("Forbidden") { StatusCode = 403};
}
public异步任务Post([FromBody]SomeData\u data)
{
//做你的事
//禁止使用自定义消息返回
返回新的ObjectResult(“禁止”){StatusCode=403};
}

注意,在ASP.NET Core 2中,返回
禁止结果
(由
禁止
返回)将触发与框架身份验证代码的某种交互,如果您没有以框架理解的方式设置身份验证,则抛出错误“未指定authenticationScheme,未找到DefaultChallengeScheme。”如果不想与ASP.NET Core的身份验证集成,请坚持返回
StatusCodeResult
以避免此错误。使用禁止()在Api中,即使我更改了DefaultBanbidscheme,控制器也会尝试重定向到Acccout/AccessDenied。只有状态码(403)似乎工作正常。稍微干净一点的版本是
返回状态码((int)HttpStatusCode.Forbidden,messageOrSerializeableObject)
实际上有一种比@MovGP0建议的更简单的方法
返回StatusCode(StatusCodes.Status403Forbidden,);
我正在研究如何在Startup.cs中设置东西,正如巴特所提到的,这里有一个有趣的线程:顺便说一句,你可以使用
禁止()
并通过覆盖此处所述的身份验证事件来抑制重定向。有趣的是,至少在ASP NET CORE 2.2中,禁止结果不会继承自StatusCodeResult。
return new ObjectResult(your_model) {StatusCode = YOUR_STATUS_CODE };
public async Task<IActionResult> Post([FromBody] SomeData _data)
{
     // do your stuff

    // return forbidden with custom message
    return new ObjectResult("Forbidden") { StatusCode = 403};
}