我正在使用分离的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
}
提前致谢。
答案 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中看到的那样。