2010-03-03 43 views
0

我們正在建立一個應用程序,它是一個Silverlight客戶端應用程序,但我們已經創建了一個MVC控制器和一些簡單的觀點來處理Silverlight控件的認證和託管本應用。作爲安全性實現的一部分,我創建了一個自定義的授權過濾器屬性來處理這個問題,但得到一些意外的結果,試圖在驗證後正確處理重定向。自定義屬性授權意外HttpContext.Request.RawUrl結果

例如,我們的Silverlight應用程序的導航框架允許用戶深層鏈接到應用程序本身的個人網頁,如http://myapplicaton.com/#/Product/171。我想要的是能夠強制用戶登錄以查看此頁面,但是在成功驗證後成功將其重新導向到該頁面。我的問題是獲取完整的請求URL來將用戶重定向到我的自定義授權篩選器屬性類中。

這是我的屬性代碼如下所示:

public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    protected bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var cookie = Cookie.Get(SilverlightApplication.Name); 

     if (SilverlightApplication.RequiresLogin) 
     { 
      return 
       ((cookie == null) || 
       (cookie["Username"] != httpContext.User.Identity.Name) || 
       (cookie["ApplicationName"] != SilverlightApplication.Name) || 
       (Convert.ToDateTime(cookie["Timeout"]) >= DateTime.Now)); 
     } 
     else 
      return false; 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext != null && AuthorizeCore(filterContext.HttpContext)) 
     { 
      var redirectPath = "~/login{0}"; 
      var returnUrl = filterContext.HttpContext.Request.RawUrl; 
      if (string.IsNullOrEmpty(returnUrl) || returnUrl == "/") 
       redirectPath = string.Format(redirectPath, string.Empty); 
      else 
       redirectPath = string.Format(redirectPath, string.Format("?returnUrl={0}", returnUrl)); 

      filterContext.Result = new RedirectResult(redirectPath); 
     } 
    } 
} 

因此,在這種情況下,如果我直接瀏覽到http://myapplicaton.com/#/Product/171,在OnAuthorize方法,在那裏我抓住了filterContext.HttpContext.Request.RawUrl財產,我希望它的價值是「/#/產品/ 171」,但事實並非如此。它總是「/」。該屬性是否不包含頁面級鏈接?我錯過了什麼嗎?

回答

1

#登錄URL(也稱爲URL的fragment部分)僅供瀏覽器在歷史記錄和鏈接之間導航。遵循此標誌的所有內容都是從不發送到服務器的,並且無法在服務器端腳本中獲取它。

+0

無賴。我懷疑(也擔心)可能是這種情況。感謝至少確認它。我現在可以決定我是否要去嘗試找出另一種解決方案,用於捕獲信息並據此進行導航。 – 2010-03-03 19:58:39