Asp.net mvc 4 如何返回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

使用使用.NET 4.5和IIS 8的MVC4应用程序。当权限检查失败时,是否有方法返回自定义未授权页面和401结果

我还使用表单身份验证,希望在用户未登录时重定向到登录页面,但在用户没有有效权限(即管理员)时重定向到未经授权的页面

我还必须小心重定向,然后在成功重定向时获得200/301结果

我需要返回401状态代码并停留在当前页面上,同时返回自定义未授权页面

我有一个返回未经授权视图的错误控制器:

[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>