2012-05-09 68 views
2

我已經設置了一個帶WIF的STS,並且想要公開用戶是否登錄,以便RP可以確定用戶是否登錄而不需要用戶重定向到STS並返回。如果用戶已登錄,則RP上將出現不同的流程流,因此在此過程中知道但不強制登錄是很重要的。User.Identity.IsAuthenticated在通用的asp.net處理程序中使用

我的計劃是在其上創建STS其中,經由HttpWebRequest的擊打時,返回context.User.Identity.IsAuthenticated(的輸出的簡單的通用處理程序,其中上下文是傳遞到ProcessRequest方法的HttpContext:

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.ContentType = "text/plain"; 

    if (context.User != null && context.User.Identity.IsAuthenticated) 
     context.Response.Write("True"); 
    else 
     context.Response.Write("False"); 
} 

我的問題是,如果用戶登錄和我打這個處理直接,它返回true,但如果我編程方式從RP命中處理程序,它返回False(事實上身份爲空)。 上午我只是完全錯誤的在做這個,打從RP處理程序將返回RP上的用戶的狀態或可我做錯了什麼?

回答

1

該處理器將只工作(返回true),如果你發送請求的STS身份驗證Cookie。只有您的網絡瀏覽器可能有這些cookie。因此它不能通過HttpWebRequest完成。當你直接從瀏覽器調用處理程序時,這也是它工作的原因。

0

我知道這有點舊線程,但答案可能有助於其他人登陸此頁面。

認證背後的神奇之處在於會話和身份驗證cookie從STS應用發送到用戶的客戶端(例如瀏覽器)。我不確定你的STS和RP應用程序是如何設計和溝通的,所以我會保持答案的一般性。要通知您的RP應用程序的身份驗證狀態,您需要:

1)以某種方式共享用戶的客戶端和您的RP應用程序之間的兩個cookie。在這種情況下,我擔心你將不得不建立自己的客戶端,並讓你的用戶使用它來訪問STS應用程序。這是因爲您無法從標準瀏覽器獲取Cookie。您構建的客戶端將Cookie發送到您的RP​​應用可以獲取它們的地方,然後將它們放置在HttpWebRequest.CookieContainer中,然後可以成功獲取處理程序的結果。我只是在解釋這種方法,說它是可行的,並表明它是多麼複雜和扭曲。

2),或者你必須跟蹤用戶的登錄狀態。與其檢查context.User,您的處理程序必須從調用RP應用程序獲取用戶標識,然後檢查該用戶是否已登錄(即該用戶有活動會話)。例如,您可以在數據庫中跟蹤或存儲會話,或者查看以下線程以獲取訪問活動會話的一些方法:

List all active ASP.NET Sessions

相關問題