自定义WebAPI“拒绝访问”响应

时间:2015-04-28 06:40:58

标签: c# asp.net rest asp.net-web-api oauth-2.0

我正在使用分离的STS(令牌服务)和自定义JSON格式化程序(ServiceStack.Text)开发具有OAUTH 2.0身份验证的ASP.net WebAPI应用程序。

我正在尝试自定义访问被拒绝的对象/消息,使其与其余的错误消息一致,但我还没有找到改变它的方法。

我也在考虑在这种情况下使用默认格式化程序。

示例:

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

示例结果:

{
  "message": "... insert error message here ...",
  "details": null
}

提前致谢。

2 个答案:

答案 0 :(得分:6)

您可以使用您可以定义其成员的类返回当前HttpActionContext的自定义响应。

            public override void OnActionExecuting(HttpActionContext actionContext)
            {
                    bool isAuthenticated = IsAuthenticated(actionContext);

                    if (!isAuthenticated)
                    {
                        actionContext.Response = actionExecutedContext.Request.CreateResponse<CustomActionResult>(HttpStatusCode.Unauthorized, new CustomActionResult
                        {
                            Message = "... insert error message here ...",
                            Details = null
                        });
                    }
                }
            }

            public class CustomActionResult
            {
                public string Message { get; set; }
                public string Details { get; set; }
            }

答案 1 :(得分:0)

要更改整个ASP.NET网站的所有“拒绝访问”消息,您可以为从您的站点返回的所有未授权状态创建HttpModule。在HttpModule中,您可以处理EndRequest事件,您可以检查response.StatusCode,如果它是401,您可以将消息更改为您想要的任何内容。像这样:

    public class AuthorizeMsgModule : IHttpModule
    {            
        public void Init(HttpApplication context)
        {                
            context.EndRequest += OnApplicationEndRequest;
        }


        // If the request was unauthorized, modify the response sent to the user
        private static void OnApplicationEndRequest(object sender, EventArgs e)
        {
            var response = HttpContext.Current.Response;
            if (response.StatusCode == 401)
            {
                response.ClearContent();
                response.Write("{\"message\": \"... insert error message here ...\",\"details\": null}");                    
            }
        }

        public void Dispose()
        {
        }
    }

在web.config中注册您的模块,例如:

<modules runAllManagedModulesForAllRequests="true">
  <add name="AuthorizeMsgModule" type="mynamespace.AuthorizeMsgModule, myassembly" />
</modules>

这将为您提供您在返回401状态时所写的内容。正如你在fiddler中看到的那样。

fiddler