Asp.net mvc 4 如何返回401响应和自定义页面?
使用使用.NET 4.5和IIS 8的MVC4应用程序。当权限检查失败时,是否有方法返回自定义未授权页面和401结果 我还使用表单身份验证,希望在用户未登录时重定向到登录页面,但在用户没有有效权限(即管理员)时重定向到未经授权的页面 我还必须小心重定向,然后在成功重定向时获得200/301结果 我需要返回401状态代码并停留在当前页面上,同时返回自定义未授权页面 我有一个返回未经授权视图的错误控制器:Asp.net mvc 4 如何返回401响应和自定义页面?,asp.net-mvc-4,.net-4.5,http-status-code-401,Asp.net Mvc 4,.net 4.5,Http Status Code 401,使用使用.NET 4.5和IIS 8的MVC4应用程序。当权限检查失败时,是否有方法返回自定义未授权页面和401结果 我还使用表单身份验证,希望在用户未登录时重定向到登录页面,但在用户没有有效权限(即管理员)时重定向到未经授权的页面 我还必须小心重定向,然后在成功重定向时获得200/301结果 我需要返回401状态代码并停留在当前页面上,同时返回自定义未授权页面 我有一个返回未经授权视图的错误控制器: [ActionName("unauthorised")] public ActionR
[ActionName("unauthorised")]
public ActionResult Http401() {
Response.StatusCode = 401;
Response.StatusDescription = "Unauthorised";
Response.SuppressFormsAuthenticationRedirect = true;
return View("unauthorised");
}
如果权限检查失败,我会使用一些方法尝试调用401:
/// <summary>Method to invoke when user attempts action without relevant permission</summary>
/// <param name="httpContext">the httpcontext</param>
/// <returns>empty result</returns>
public ActionResult InvokeHttp401(HttpContextBase httpContext) {
Transfer("/error/unauthorised");
return new EmptyResult();
}
private void Transfer(string url) {
var uriBuilder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, Request.ApplicationPath); // Create URI builder
uriBuilder.Path += url; // Add destination URI
string path = Server.UrlDecode(uriBuilder.Uri.PathAndQuery); // Because UriBuilder escapes URI decode before passing as an argument
this.HttpContext.RewritePath(path, false); // Rewrite path
HttpContext.Server.TransferRequest(path, true);
}
如果用户未登录,authorize标记将重定向到login,则进行其他权限检查
通过上述设置,我可以返回401结果并停留在当前url上,但显示的是IIS 401错误,而不是我的当前页面
我还尝试在web.config文件中设置以下内容:
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace">
.....
<error statusCode="401" responseMode="ExecuteURL" path="/Error/unauthorised" />
</httpErrors>
.....
但这没什么区别。如果我没有在Http401 ActionResult中设置状态代码,我可以让自定义未授权页面出现,但它只是返回了一个200结果
我已经看过了关于这个的帖子(特别是Timothy的答案,它扩展了授权标签),但是如果没有前面描述的类似错误,我无法让任何一个帖子正常工作
有人能帮忙吗?终于找到了答案- 使用Timothy在链接问题中建议的自定义授权标记组合,我可以临时将状态代码设置为418,然后在Global.End_请求中将其更改回401 我必须做的最后一件事是将418添加到我的web.config中,并使用
PassThrough
模式:
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Error/not-found" />
<remove statusCode="500" />
<error statusCode="500" responseMode="ExecuteURL" path="/Error/error" />
<remove statusCode="401" />
<error statusCode="401" responseMode="ExecuteURL" path="/Error/unauthorised" />
</httpErrors>
我在同一个url上得到了401结果,以及我的自定义视图。随着物联网的出现,我希望有人能够足够聪明地实现一个咖啡壶,它附带一个茶壶,当你把茶壶放在茶壶座上时,它会发出418。此外,我没有看到您将418添加到web.config中
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Error/not-found" />
<remove statusCode="500" />
<error statusCode="500" responseMode="ExecuteURL" path="/Error/error" />
<remove statusCode="401" />
<error statusCode="401" responseMode="ExecuteURL" path="/Error/unauthorised" />
</httpErrors>