2008-08-29 126 views
6

我正在寫一個應用程序,使用asp.net-mvc部署到iis6。我正在使用表單身份驗證。通常,當用戶嘗試訪問資源時沒有正確授權,我希望他們被重定向到登錄頁面。 FormsAuth對我來說很簡單。繞過表單身份驗證自動重定向到登錄,如何?

問題:現在我有一個操作正在被控制檯應用程序訪問。有什麼最快的方式讓這個動作響應瓦特/狀態401,而不是將請求重定向到登錄頁面?

我希望控制檯應用程序能夠響應這個401 StatusCode而不是透明。我還想保留默認值,將未經授權的請求重定向到登錄頁面行爲。

注:作爲一個測試,我已將此添加到我的Global.asax中,它沒有超越窗體身份驗證:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.SkipAuthorization = true; 
} 

@Dale和安迪

我使用的AuthorizeAttributeFilter在MVC預覽版4中提供。這返回一個HttpUnauthorizedResult。這個結果正確地將statusCode設置爲401.根據我的理解,問題在於,asp.net攔截了響應(因爲它被視爲401)並重定向到登錄頁面,而不是讓它通過。我想繞過某些網址的攔截。

+1

查看http://stackoverflow.com/questions/2839406/forms-authentication-disable-redirect-to-the-login-page – 2013-08-09 05:24:21

回答

5

好的,我解決了這個問題。我做了一個自定義的ActionResult(HttpForbiddenResult)和自定義的ActionFilter(NoFallBackAuthorize)。

爲了避免重定向,HttpForbiddenResult標記了狀態碼爲403的響應.FormsAuthentication不會捕獲此代碼的響應,因此可以有效地跳過登錄重定向。 NoFallBackAuthorize過濾器檢查用戶的授權是否與包含的授權過濾器類似。它的區別在於,當訪問被拒絕時,它返回HttpForbiddenResult。

的HttpForbiddenResult是相當簡單:

 
public class HttpForbiddenResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     context.HttpContext.Response.StatusCode = 0x193; // 403 
    } 
} 

這似乎並不可能跳過在FormsAuthenticationModule登錄頁面重定向。

+0

我也這麼做了。這傢伙認爲這是正確的做法:http://danielirvine.com/blog/2011/07/18/understanding-403-forbidden – 2011-09-16 13:13:06

-1

我做了一些谷歌搜索,這就是我想出了:


    HttpContext.Current.Response.StatusCode = 401; 

不知道是否可行與否,我沒有測試它。無論哪種方式,值得一試,對吧? :)

0

您是否爲該操作編寫了自己的FormsAuth屬性?如果是這樣,在OnActionExecuting方法中,您將傳遞FilterExecutingContext。您可以使用它來傳回401代碼。

public class FormsAuth : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(FilterExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.StatusCode = 401; 
     filterContext.Cancel = true; 
    } 
} 

這應該有效。我不確定您是否編寫了FormsAuth屬性,或者您是否從其他位置獲取它。

0

我還沒有使用Preview 4中的AuthorizeAttribute。我推出了自己的產品,因爲自從第一個CTP以來,我一直在使用MVC框架。我快速查看了反射器中的屬性,並且正在執行上面我在內部提到的內容,除了它們使用401的十六進制等價物。我將需要進一步查看調用,以查看異常被捕獲的位置,因爲超過很可能就是他們在做重定向的地方。這是您需要覆蓋的功能。我不確定你是否可以做到這一點,但是當我找到它並給你一個解決方法時,我會回覆,除非Haacked看到並自己發佈。

1

可能是一個kludge(甚至可能不工作),但在您的登錄頁面上看看是否Request.QueryString["ReturnUrl"] != null,如果是這樣設置Response.StatusCode = 401

請記住,您仍然需要讓控制檯應用程序以某種方式進行身份驗證。你不會免費獲得HTTP基本認證:你必須自己推出,但是有很多實現。

+0

這對TheDeeno概述的原因沒有幫助。 – 2009-04-16 17:00:33