簡體   English   中英

繞過表單身份驗證自動重定向到登錄,如何?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM