【问题标题】:How can i override default message Authorization has been denied for this request我如何覆盖默认消息此请求的授权已被拒绝
【发布时间】:2020-03-14 02:02:29
【问题描述】:

如何在 MVC WebApi 中使用自定义响应消息更改默认响应消息?

{ "Message": "Authorization has been denied for this request." }

提前致谢

这是我的自定义响应模型

public class DefaultResponseModel<T>
    {
        public string ResponseID { get; private set; }
        public DateTimeOffset ResponseDateTime { get; private set; }
        public string RequestMethod { get; private set; }
        public string IPAddress { get; private set; }
        public T Data { get; set; }

        public DefaultResponseModel(ApiController controller)
        {
            ResponseDateTime = DateTimeOffset.Now;
            RequestMethod = controller.Request.Method.ToString();
            if (controller.Request.Properties.ContainsKey("MS_HttpContext"))
            {
                var ctx = controller.Request.Properties["MS_HttpContext"] as HttpContextBase;
                if (ctx != null)
                {
                    IPAddress = ctx.Request.UserHostAddress;
                }
                else
                {
                    IPAddress = "--";
                }
            }
            ResponseID = controller.Request.Properties.FirstOrDefault(x => x.Key == "RequestID").Value.ToString();
        }
        public DefaultResponseModel(HttpRequestMessage Request)
        {
            ResponseDateTime = DateTimeOffset.Now;
            RequestMethod = Request.Method.ToString();
            if (Request.Properties.ContainsKey("MS_HttpContext"))
            {
                var ctx = Request.Properties["MS_HttpContext"] as HttpContextBase;
                if (ctx != null)
                {
                    IPAddress = ctx.Request.UserHostAddress;
                }
                else
                {
                    IPAddress = "--";
                }
            }
            ResponseID = Request.Properties.FirstOrDefault(x => x.Key == "RequestID").Value.ToString();


        }

如您所说,我想在授权代码中使用它,因为我生成了一个 ResponseID 并将其发送到我的响应模型。 我想对每个响应使用相同的模型。

【问题讨论】:

  • 好的,那你为什么不在自定义授权属性中登录呢?
  • 但是我能找到在授权响应中使用我的自定义模型的方法吗?
  • 我不明白您所说的“授权响应”是什么意思。发送的响应是 403。如果您的意思是在授权属性完成后希望另一个组件执行某些操作,那么您可能需要另一个操作过滤器属性或 HTTP 模块。请参阅stackoverflow.com/questions/11507496/… 以获得帮助。
  • 如果可能的话,我只想用我的自定义类模型修改默认响应消息 ({ "Message": "Authorization has been denied for this request." })..
  • 现在我很困惑。我的回答向您展示了如何设置响应消息。如果您想使用您的对象,请在HandleUnauthorizedRequest 方法中使用。您是否尝试将您的 ResponseID 放入消息中?

标签: c# asp.net-mvc asp.net-web-api model-view-controller authorization


【解决方案1】:

您必须创建一个派生自AuthorizeAttribute 的类并覆盖HandleUnauthorizedRequest 方法。 Web API 中的类似内容(注意:未经测试):

using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Controllers;

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    {
        actionContext.Response = actionContext.Request.CreateErrorResponse(
            HttpStatusCode.Forbidden, 
            "Custom message goes here");
    }
}

那么无论您在哪里使用AuthorizeAttribute,都将其替换为MyAuthorizeAttribute

对于 MVC,您改为继承 System.Web.Mvc.AuthorizeAttribute

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext actionContext)
    {
        actionContext.Result = new HttpStatusCodeResult(
            HttpStatusCode.Forbidden, 
            "Custom message goes here");
    }
}

【讨论】:

  • 我现在的问题是,它是如何工作的?我正在使用自定义响应模型,我该如何实现这个模型? actionContext.Result = new HttpStatusCodeResult( HttpStatusCode.Forbidden, new DefaultResponseModel(actionContext.HttpContext.Request.UserHostAddress) { Data = "此请求的授权已被拒绝!" });
  • 不幸的是,HttpStatusCodeResult 没有将对象作为参数。你想达到什么目的?您是否将 403 响应重定向到自定义错误页面?如果是这样,您可以将对象存储到 actionContext.Controller.TempData 字典中,然后在控制器方法中将其拉出。
  • 我正在使用自定义响应模型,因为我必须发送我在日志处理程序中生成的 ID,而且我也想将它发送到这里......我该怎么做?
  • 你能提供更多细节吗?
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2019-07-17
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多