[英]Bypass Forms Authentication auto redirect to login, How to?
我正在使用asp.net-mvc部署到iis6編寫應用程序。 我正在使用表單身份驗證。 通常當用戶嘗試在沒有適當授權的情況下訪問資源時,我希望將它們重定向到登錄頁面。 FormsAuth讓我很容易做到這一點。
問題:現在我有一個控制台應用程序訪問的操作。 什么是讓這個動作響應w /狀態401而不是將請求重定向到登錄頁面的最快方法?
我希望控制台應用程序能夠對此401 StatusCode做出反應,而不是透明。 我還想保留默認值,將未經授權的請求重定向到登錄頁面行為。
注意:作為測試我將其添加到我的global.asax並且它沒有繞過表單身份驗證:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpContext.Current.SkipAuthorization = true;
}
@Dale和Andy
我正在使用MVC預覽4中提供的AuthorizeAttributeFilter。這將返回一個HttpUnauthorizedResult。 這個結果正確地將statusCode設置為401.正如我所理解的那樣,問題是asp.net正在攔截響應(因為它被調為401)並重定向到登錄頁面而不是讓它通過。 我想繞過某些網址攔截。
好的,我解決了這個問題。 我做了一個自定義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中的登錄頁面重定向。
可能是一個kludge(甚至可能不工作),但在你的登錄頁面上看看Request.QueryString["ReturnUrl"] != null
如果是這樣設置Response.StatusCode = 401
。
請記住,您仍然需要讓您的控制台應用程序以某種方式進行身份驗證。 您沒有免費獲得HTTP基本身份驗證:您必須自己動手,但有很多實現。
您是否為該操作編寫了自己的FormsAuth屬性? 如果是這樣,在OnActionExecuting方法中,您將傳遞FilterExecutingContext。 您可以使用它來傳回401代碼。
public class FormsAuth : ActionFilterAttribute
{
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
filterContext.HttpContext.Response.StatusCode = 401;
filterContext.Cancel = true;
}
}
這應該工作。 我不確定你是否編寫了FormsAuth屬性,或者你是否從其他地方獲得了它。
我還沒有使用預覽版4中的AuthorizeAttribute。 我自己動手,因為自從第一個CTP以來我一直在使用MVC框架。 我快速查看了反射器中的屬性,它正在內部執行我上面提到的,除了它們使用相當於401的十六進制。我將需要進一步查看調用,以查看異常被捕獲的位置,因為超過可能是他們正在進行重定向的地方。 這是您需要覆蓋的功能。 我不確定你是否可以這樣做,但是當我找到它並給你一個解決方法時我會回復,除非Haacked看到並自己發布。
我做了一些谷歌搜索,這就是我提出的:
HttpContext.Current.Response.StatusCode = 401;
不確定它是否有效,我還沒有測試過。 無論哪種方式,都值得一試,對嗎? :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.