【问题标题】:Web Api Owin: How to "remap/rename" the fields in the json response created by BaseValidatingContext.SetErrorWeb Api Owin:如何“重新映射/重命名”由 BaseValidatingContext.SetError 创建的 json 响应中的字段
【发布时间】:2017-05-25 19:08:45
【问题描述】:

我正在我的 Web API2 服务器中实现基于 OAuth 令牌的安全性(在 IIS 下运行)

我正在使用提供OAuthAuthorizationServerProvider 等的各种中间件,这些中间件采用从BaseValidatingContext 派生的各种参数

比如我有下面的sn-p...

 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {                       
        var result = await GetAuthenticateAndGetClaimsAsync("dummy", context.UserName, context.Password);

        if (result.HasError)
        {             
          context.SetError("Error code", "Error description);             
          return;
        }

context.SetError("Error code", "Error description); 的调用将使响应的主体具有以下内容..

{
   "error": "Error code",
   "error_description": "Error description
}

我想更改这些字段的名称,以反映我在应用程序其他地方使用的错误,所以我可以有类似的东西..

 {
   "code": "Error code",
   "message": "Error description
}

这可能吗?如果可以,我该怎么做?

我自己也可以设置状态码也不错,但这不是那么重要,我想更改的更多是上述字段。

提前感谢您的任何建议。

【问题讨论】:

  • 嗨..什么重新映射对象?..上下文.SetError ..return somehting?
  • 是的,我希望返回的错误对象包含字段代码和消息,而不是错误和错误描述
  • 好的,所以尝试将它重新映射到您的自定义对象..类似于 public class MyCusotmError { public string message {get; set;} 公共字符串代码 {get; set;}} 然后 var error = context.SetError("Error code", "Error description); 然后 var my csutomeror = new MyCusotmError { message = error.error_description , code = error.error}

标签: asp.net-web-api oauth-2.0 asp.net-identity owin


【解决方案1】:

您好尝试创建您的自定义错误对象,然后可能是一个方法(扩展方法)从 AspNEt 的错误映射到您的错误..somehting 喜欢:

public class MyCustomError{

  public string Code {get; set;}
  public string Message {get; set;}

}

然后你可以创建

public static class ErrorManager{

   public static ToMyCustomError(this Error err){ //<-- set Here the CORRECT TYPE RETURNING FROM context.SetError
      return new MyCustomError{
        Code = err.error;
        Message=err.error_description;
       }
   }
}

然后你可以这样使用:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {                       
        var result = await GetAuthenticateAndGetClaimsAsync("dummy", context.UserName, context.Password);

        if (result.HasError)
        {             

          return context.SetError("Error code", "Error  description).ToMyCustomError();
        }
}

【讨论】:

  • 这里的问题是SetError()没有返回类型(是void)
  • 不幸的是没有。我确实检查了here,我们可以看到没有过载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2023-03-10
  • 2018-12-21
  • 2021-07-14
  • 2020-12-07
相关资源
最近更新 更多