2010-09-15 47 views
31

我想從地址欄中刪除「returnurl =/blabla」,當用戶想要訪問登錄所需頁面時。因爲我試圖在登錄後將用戶重定向到靜態頁面以進行一些選擇。如何從url中刪除returnurl?

我該怎麼做?

回答

20

這是表單身份驗證的性質。 (即時猜測你正在使用)。

也就是說,當您訪問需要認證的頁面時,ASP.NET會將您重定向到登錄頁面,並將ReturnUrl作爲參數傳入,以便您可以返回到您登錄後發送的頁面。

要刪除此功能將破壞窗體身份驗證本身的語義和設計。 (IMO)

我的建議 - 如果你不需要它,不使用它

我試圖將用戶重定向到一個 靜態頁面登錄後做一些 選擇。

一塊蛋糕 - 你做你的登錄,而不是做FormsAuthentication.RedirectFromLoginPage(它使用非常RETURNURL查詢參數)後,只需使用FormsAuthentication.SetAuthCookie和重定向,無論你想。

+0

FormsAuthentication.SetAuthCookie是我在做什麼正確的now.I只是想從地址欄將其刪除。 – 2010-09-15 19:57:11

+0

然後,我的第一條評論就是說 - 你完全可以不使用表單身份驗證。沒有簡單的方法來做到這一點(我知道)。記住ANY頁面可以重定向到登錄頁面(並且ASP.NET執行此操作)。我唯一能想到的方式是掛鉤Global.asax事件並重寫URL。爲什麼你在乎網址是否在那裏? – RPM1984 2010-09-15 21:58:34

+0

,並且該評論與您的​​評論相矛盾「因爲我試圖在登錄後將用戶重定向到靜態頁面以進行一些選擇。」 ReturnURL不會阻止您在登錄後執行您自己的重定向,除非您使用RedirectFromLoginPage,而您已經說過您並不是。所以我不知道你是什麼問題。 ReturnUrl如何阻止您進行重定向? – RPM1984 2010-09-15 21:59:34

8

由於RPM1984指出的那樣,你不必在登錄後用戶到指定的URL重定向。

如果它是你必須刪除ReturnUrl查詢參數有幾個選項。可能最簡單的方法是在您的登錄網頁/控制器中檢查Request.QueryStrings集合中是否存在ReturnUrl參數。如果存在,您可以重新定向回登錄頁面,但不包含ReturnUrl

另一種選擇是爲FormsAuthenticationModule創建自定義實現,FormsAuthenticationModule是根據表單身份驗證票據對用戶進行身份驗證並負責將未經授權的用戶重定向到登錄頁面的類。不幸的是,FormsAuthenticationModule類的方法不是虛擬的,所以你不能創建派生類並重寫所需的方法,但好消息是這個類非常簡單 - 總共只有100-200行代碼,並且使用Reflector可以快速創建您自己的自定義FormsAuthenticationModule類。如果你走這條路線(我不建議這樣做),那麼你需要做的就是去掉OnLeave方法中的代碼,該方法的參數爲ReturnUrl。 (除了修改這個類以外,還需要配置Web.config文件,以便應用程序使用您的自定義FormsAuthenticationModule類而不是.NET Framework中的類。)

快樂編程!

10

創建自定義授權屬性

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(
         AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string loginUrl = "/"; // Default Login Url 
      filterContext.Result = new RedirectResult(loginUrl); 
     } 
    } 
} 

然後用它你的控制器

[CustomAuthorizeAttribute] 
public ActionResult Login() 
{ 


    return View(); 
} 
+2

我更喜歡這個解決方案,但我相信在'HandleUnauthorizedRequest'中使用代碼更有意義,並使用此行代替'filterContext.Result = new RedirectResult(FormsAuthentication.LoginUrl);' – 2013-07-04 19:09:58

2

上的位置標記添加到您的web.config。如果您的頁面位於子目錄中,請將web.config添加到子目錄中。

<location path="ForgotPassword.aspx"> 
    <system.web> 
     <authorization> 
      <allow users="*"/> 
     </authorization> 
    </system.web> 
</location> 

ASP將忽略添加ReturnUrl查詢字符串並指示登錄。

+0

哇,我有這個問題看這裏http ://stackoverflow.com/questions/19301787/asp-net-links-wont-redirect-to-the-right-page 感謝它幫助我,我們有相同的頁面名稱:) – meda 2013-10-10 17:59:16

12

將此添加到您的Global.asax文件中。

public class MvcApplication : HttpApplication { 

    private const String ReturnUrlRegexPattern = @"\?ReturnUrl=.*$"; 

    public MvcApplication() { 

    PreSendRequestHeaders += MvcApplicationOnPreSendRequestHeaders; 

    } 

    private void MvcApplicationOnPreSendRequestHeaders(object sender, EventArgs e) { 

    String redirectUrl = Response.RedirectLocation; 

    if (String.IsNullOrEmpty(redirectUrl) 
     || !Regex.IsMatch(redirectUrl, ReturnUrlRegexPattern)) { 

     return; 

    } 

    Response.RedirectLocation = Regex.Replace(redirectUrl, 
               ReturnUrlRegexPattern, 
               String.Empty); 

    } 
+0

http:// stackoverflow。 com/questions/13394999/form-authentication-and-url-rewriting我正在使用自定義窗體身份驗證。如果我使用你已經給出了控制循環的代碼,它說 - 「太多的重定向」。我認爲問題是,當Control進入像'mywebsite.com/Login'這樣的'Login'頁面時,它會檢查身份驗證並重定向到Login.aspx頁面。並且您的代碼再次重定向到「登錄」頁面。這個循環繼續。你能幫助我嗎? – 2012-11-15 11:15:27

+0

我們不需要在MvcApplication構造函數中使用':base()'嗎? – Roberto 2016-04-14 22:19:47

1

如果您未滿行爲部分使用asp.net控制loginstatus然後在登錄狀態控制按F4(房產),我們可以看到LogOutAction有選擇返回到登錄頁面。

注:爲了成功地實現它,你必須有名稱的login.aspx

+0

它被稱爲「重定向到登錄頁面」(在標記中它是LogoutAction =「RedirectToLoginPage」) – 2016-06-22 16:00:47

8

簡單的登錄頁面...

[AllowAnonymous] 
public ActionResult Login() { return View(); } 

[AllowAnonymous] 
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); } 

Webconfig

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LoginRedirect" timeout="2880" /> 
</authentication> 
+0

在我的情況下,我必須更改startup.auth.cs中的路徑而不是web配置中: 'app.UseCookieAuthentication CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LOGINPATH =新PathString(( 「/帳號/ LoginRedirect」)), ...' 我也用RedirectToActionPermanent而不是RedirectToAction,因爲它是pernament – 2014-12-29 00:42:01

+0

這是一個很好的解決方案 - 唯一需要注意的是,您將在瀏覽器歷史記錄中向LoginRedirect發出請求,因此如果有人點擊「返回」按鈕一次,則會將其返回到LoginRedirect,然後再返回到登錄。 – Jim 2015-12-01 20:15:26

-1
protected void LoginControl_LoggedIn(object sender, EventArgs e) 
{ 
    Response.Redirect("~/selection.aspx"); 
} 
0
void Application_BeginRequest(object s, EventArgs e) 
{ 
    // ................ 

    // strip return Return Url 
    if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) && Request.Path.IndexOf("login.aspx")!=-1) 
     System.Web.HttpContext.Current.Response.Redirect("~/login.aspx"); 
0

您可以使用HttpUtility.ParseQueryString刪除該元素。如果你使用VB.NET那麼這段代碼做到這一點

Dim nvcQuery As NameValueCollection 
Dim strQuery As String = "" 

If Not IsNothing(Request.QueryString("ReturnUrl")) Then 
    If Request.QueryString("ReturnUrl").Length Then 
     nvcQuery = HttpUtility.ParseQueryString(Request.QueryString.ToString) 
     For Each strKey As String In nvcQuery.AllKeys 
      If strKey <> "ReturnUrl" Then 
       If strQuery.Length Then strQuery += "&" 
       strQuery += strKey + "=" + nvcQuery(strKey) 
      End If 
     Next 
     If strQuery.Length Then strQuery = "?" + strQuery 
     If Request.CurrentExecutionFilePath <> "/default.aspx" Then 
      Response.Redirect(Request.CurrentExecutionFilePath + strQuery) 
     Else 
      Response.Redirect("/" + strQuery) 
     End If 
     Response.Write(Server.HtmlEncode(strQuery)) 
    End If 
End If 

我會把這在Page.Init事件 - 很明顯,你將需要改變「/default.aspx」,以配合您的登錄頁面的URL 。

1

如果要從請求中刪除returnURL並將其重定向到特定路徑,則可以按照此步驟操作。

首先獲取當前上下文,驗證用戶是否已通過身份驗證並最終重定向當前路徑。

HttpContext context = HttpContext.Current; 
     //verify if the user is not authenticated 
     if (!context.User.Identity.IsAuthenticated) 
     { 
      //verify if the URL contains ReturnUrl 
      if (context.Request.Url.ToString().Contains("ReturnUrl")) 
      { 
       //redirect the current path 
       HttpContext.Current.Response.Redirect("~/login.aspx"); 
      } 

     } 

我把這個代碼到Page_Load方法從我的類Login.aspx.cs