【问题标题】:How can pass string with the “forbidden” response in .net core 2.2 web API如何在.net core 2.2 web API中传递带有“禁止”响应的字符串
【发布时间】:2020-12-28 15:02:14
【问题描述】:

一切正常:

context.Result = new ForbidResult(); 

但我想传递一个带有 “禁止” 响应的消息,如下所示:

context.Result = new ForbidResult("Forbidden");

在 .net core 2 网络 API 中。但是当我写上面这行代码时,我得到了

500 内部服务器错误

所以,任何人都可以帮助我如何执行上述代码行。

示例代码

public class ClaimRequirementFilter : Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
          // working code
          context.Result = new ForbidResult();

          // Code with error (500 Internal Server Error)
          context.Result = new ForbidResult("Forbidden");
     }
 }

【问题讨论】:

  • 看起来带有字符串参数的 ForbidResult 构造函数不是用于传递消息,而是实际上挑战身份验证方案,如 here
  • 是的,它是 ForbidResult 构造函数,然后我无法理解为什么它会生成 500 Internet 服务器错误作为响应? @MindSwipe
  • 启动服务器,看看发生500内部(不是互联网)服务器错误时会发生什么,应该会抛出异常。这是因为您不能将任意文本作为参数传递给 ForbidResult
  • 我执行您(@MindSwipe)所说的,但仍然收到 500 内部服务器错误。你能(@MindSwipe)给我一行工作代码吗?
  • 我不是要你做任何事情,我是说你所做的事情是不正确的。要使用 ForbidResult 的字符串参数,您首先需要向应用程序添加身份验证方案,然后在构造函数中使用相同的名称,否则会引发错误(就像这里一样)。另外,如果可以的话,我不能给你一个有效的代码行,这将是一个答案而不是评论。

标签: c# asp.net-core-2.1


【解决方案1】:

我创建了这两个类(1. CustomError & 2. CustomUnauthorizedResult)并使用这些类来处理授权。在这里您可以传递动态消息和状态码。

public class CustomError
{
    public string Error { get; }

    public CustomError(string message)
    {
        Error = message;
    }
}

public class CustomUnauthorizedResult : JsonResult
{
    public CustomUnauthorizedResult(string message, int statusCode) : base(new CustomError(message))
    {
        StatusCode = statusCode;
    }
}

public class ClaimRequirementFilter : Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        context.Result = new CustomUnauthorizedResult("Authorization failed.", statusCode:403);
    }
}

【讨论】:

    【解决方案2】:

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

    查看语法,

    return new ObjectResult("Message") {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};
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2020-01-26
      • 2019-08-06
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多