2013-08-30 45 views
4

使用使用.NET 4.5和IIS 8的MVC4應用程序。當權限檢查失敗時,是否有辦法返回定製的未授權頁面和401結果?如何返回401響應和自定義頁面?

我也使用表單身份驗證,並希望在用戶未登錄時重定向到登錄頁面,但在用戶沒有有效權限(即Admin)時重定向到未經授權的頁面。

我還必須小心重定向,然後在成功重定向時獲得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); 
    } 

注意:我正在使用Server.TransferRequest,以便我可以嘗試並返回當前URL上的401結果,而不會導致任何重定向。我在一個普通的ActionResult檢查權限如下:

[Authorize] 
public ActionResult MyMethod() { 
    if (!UserHasPermission(Admin)) 
    return InvokeHttp401(HttpContext); 
    ...... 

凡authorize標籤將重定向到登錄,如果用戶沒有登錄,其他權限檢查。

通過上述設置,我可以返回401結果並保持當前的URL,但顯示的是IIS 401錯誤而不是當前頁面。

我也試圖設置在我的web.config文件中的以下內容:

<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace"> 
     ..... 
     <error statusCode="401" responseMode="ExecuteURL" path="/Error/unauthorised" /> 
    </httpErrors> 

但是,這沒有什麼區別。如果我沒有在我的Http401 ActionResult中設置狀態碼,但是它只是返回一個200結果,那麼我能夠獲得未經授權的自定義頁面。

我已經看過這個question的帖子(特別是蒂莫西的答案,它擴展了授權標籤),但是沒有像前面描述的那樣沒有類似的錯誤而無法得到任何這種工作。

任何人都可以幫忙嗎?

回答

3

想通了最後 -

使用自定義的組合授權的標籤,由Timothy在鏈接的問題建議,而這blog post,我能狀態代碼臨時設置爲418,然後改變它返回到Global.End_Request中的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結果,以及我的自定義視圖。

+1

隨着物聯網的興起,我期望和希望有人會聰明地實現一個咖啡壺,隨茶壺發送一個418,當你把它放在持有人。另外我沒有看到你在web.config中添加418 – Luminous

相關問題