2009-05-27 77 views
1

我在ASP.NET MVC中成功地使用了自定義授權。它只涉及User.Identity和上下文中對象的所有者之間的比較。ASP.NET MVC授權和超鏈接

在簡單的條件下使用時,它就像一個魅力。當我嘗試在一個Web請求中調用2個操作時,它變得更加複雜。

可以說,我想顯示其將在即時通過我的應用程序生成的圖像。該圖像由控制器生成,因此即使它不存在物理上的存在,也可以通過URL來引用它。我已經決定用戶必須登錄併成爲所有者才能查看它,因此我將其授權機制應用於其中。

實施例:< IMG SRC =「http://myapplication.com/images/generate/3」/>

當我包括在頁面中這樣的圖像通過其動作的超鏈接,我期望認證當圖像生成時,用戶仍然處於服務器端的上下文中。在我的測試中情況並非如此。圖像從不顯示,因爲我的授權檢查不起作用。在圖像控制器中,User.Identity是空的,就好像用戶沒有簽名一樣。

在此期間,同樣的用戶仍然登錄到該網站,可以繼續他的身份來瀏覽方面...沒有那些正常的圖像。

我不知道如何使這個過程安全地工作...

非常感謝!

馬克Lacoursiere RooSoft計算INC。

回答

1

只是想知道,如果你檢查是否

Thread.CurrentPrincipal 

也是控制器是空的?它應該包含相同的值。

另一個建議是在會話中存儲的User.Identity價值?

+0

你確定這兩個請求將在同一線程上進行? – RooSoft 2009-05-27 13:59:45

1

您需要在global.asax中爲每個請求設置您的身份。我爲此使用了自定義Principal和Identity。

private void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     SetIdentity(new MyIdentity 
        { Type = UserType.Inactive, Id = int.MinValue }); 
    } 
    else 
    { 
     HttpCookie authCookie = Request.Cookies[ 
      FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = 
        FormsAuthentication.Decrypt(authCookie.Value); 

      var identity = Repository.GetIdentity 
        (authTicket.Name, new HttpRequestWrapper(Request)); 
      SetIdentity(identity); 
     } 
    } 
} 

private void SetIdentity(MyIdentity identity) 
{ 
    Context.User = new MyPrincipal { Identity = identity }; 
    Thread.CurrentPrincipal = Context.User; 
} 

這可行,但我不能保證它是安全的。在使用此代碼之前,您應該閱讀FormsAuthentication vulnerabilities上的這篇文章。你必須明白,這段代碼假設cookie是有效的並且沒有被劫持。還有一些額外的安全措施可以用來減少這些代碼沒有顯示的漏洞。

1

這可能是當瀏覽器中的站點鏈接是http:\ www.mysite.com(或http:\ subdomain.mysite.com)並且您在應用程序中使用http:\ mysite.com \ image \ 5時。表單身份驗證使用Cookie。而這些cookie可能屬於域名和子域名。
要了解發生了什麼,我建議使用安裝FireBug的FireFox。爲您的網站啓用網絡和控制檯選項卡,並對網頁進行完整刷新。在這些標籤之一中看到請求後(完全是Net標籤)。在請求的左側,您可以看到「加號」按鈕,點擊後您會看到標題和響應標籤(more detailed description of firebug)。看看Headers選項卡並嘗試找到像FORMAUTH(或者你在config中設置爲表單cookie名稱)的東西。如果你沒有看到它 - 問題出在域名上。