2014-02-26 42 views
6

我有一個ASP.NET Web應用程序(在.NET 4.5上運行)。目前它正在進行表單身份驗證。我們已經建立了具有多個聯合,一些內部和一些外部(客戶STS)的ADFS 3服務器,並且我們希望將Web應用程序配置爲使用主動身份驗證模型。如果我理解正確,那意味着我們將繼續在我的Web應用程序中使用登錄表單,並且它將從用戶那裏收集憑證,然後向我們的ADFS服務器發送安全憑證請求。令牌請求可能會告訴ADFS哪個聯合發送請求。如果一切都成功了,那麼我從ADFS獲得一個令牌,驗證它,然後構造一個ClaimPrinciple並從那裏開始。ADFS Active Authentication .NET 4.5(Post-WIF)

現在,在這種背景下,我遇到的問題是如何將令牌請求發送到.NET 4.5中的ADFS。儘管被標記爲適用於.NET 4.5,但我看到的每個示例均使用來自WIF的舊UserNameWSTrustBinding類。這已被棄用,不在4.5中。網頁搜索「UsernameWSTrustBinding 4.5等效」已無果。我見過一個人構建他自己的類來複制功能,但我不相信這是必要的。我有一個預感,在這裏有一個類,我應該使用WSTrustChannelFactory中的綁定,但我找不到它。或者,也許整個WSTrustChannelFactory模式也是過時的(但爲什麼它會被包含在.NET 4.5中)?

任何人都可以提供一小段代碼,甚至可以闡明你應該如何在.NET 4.5中進行主動身份驗證?

+0

https://github.com/thinktecture/Thinktecture.IdentityModel.45/blob/master/IdentityModel/Thinktecture.IdentityModel/WSTrust/UserNameWSTrustBinding.cs –

+0

@WiktorZychla好吧,不管你信不信,這正是該例子中,我上面提到的「某人」構建自己的班級,實際上將班級移植到4.5。這真的是最好的方式嗎? – ctb

+0

看起來沒有其他辦法。我沒有想到爲什麼用戶名密碼從bcl中刪除,但Dominick重新創建了它。多米尼克是一位知名專家,不僅僅是「某人」。 –

回答

1

到目前爲止,我最好的想法是檢查用戶cookie中的用戶名(如果存在)或者當cookie不存在時從常規登錄表單中檢查用戶名。通過這些信息,我可以確定是否需要將其發送給IdP。在需要將它發送給IdP的情況下,我可以創建一個請求URL並重定向。

WSFederationAuthenticationModule instance = FederatedAuthentication.WSFederationAuthenticationModule; 
SignInRequestMessage request = instance.CreateSignInRequest(Guid.NewGuid().ToString(), instance.Realm, true); 
request.AuthenticationType = "urn:federation:authentication:windows"; 
Response.Redirect(request.WriteQueryString()); 

當然,我可以調整與適當.HomeRealm值或.AuthenticationType該請求以跳過HRD過程,然後在此之後,它們將被髮送回認證的應用程序和用適當的請求權。

這不是完美的一個理由對我來說,答案是如果用戶從未登錄過或禁用了Cookie,並且取決於聯合身份驗證,他們可能需要登錄兩次。也就是說,一次到應用程序的登錄表單,一次到ADFS表單。這就是爲什麼我希望能夠以編程方式發送請求而不是重定向。這樣我就可以發送用戶名已被應用程序收集的用戶名&,而不必在ADFS再次收集它們。

因此,我不會將此標記爲答案。我想更好地堅持下去。