2012-07-16 13 views
3

我真的很感謝在理解索賠如何在本地桌面應用程序中使用的一些幫助。這是場景:我想顯示一個選項卡f.e.取決於用戶是否擁有像「AnalysisAllowed:true」這樣的聲明。所以我想在應用程序啓動時獲取聲明,並在稍後與他們綁定。在DesktopApp中獲取STS的索賠(有效)

所有示例都在討論如何讓WCF使用Authorization-和AuthenticationManagers對其他WCF服務執行基於聲明的調用,但我只想聯繫sts(我該怎麼做?WCF-Fed綁定?)並緩存的東西使用它。沒有其他服務電話... :)

非常感謝!

回答

2

在默認配置(客戶端& STS)中,您獲得的令牌將被加密(除了被簽名以外)。如果你擁有整個事物(客戶端和服務),那麼你可以調整一些旋鈕,使得令牌可以從客戶端「讀取」(因此,不加密)。

這裏有一些代碼會給你一個來自ADFS的未加密的SAML令牌(關鍵是要求一個「承載」令牌並且配置沒有加密證書的ADFS依賴方)。

private static SecurityToken GetSamlToken(string realm, string stsEndpoint, ClientCredentials clientCredentials) 
{ 
    using (var factory = new WSTrustChannelFactory(
     new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
     new EndpointAddress(new Uri(stsEndpoint)))) 
    { 
     factory.Credentials.UserName.UserName = clientCredentials.UserName.UserName; 
     factory.Credentials.UserName.Password = clientCredentials.UserName.Password; 
     factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 
     factory.TrustVersion = TrustVersion.WSTrust13; 

     WSTrustChannel channel = null; 

     try 
     { 
      var rst = new RequestSecurityToken 
          { 
           RequestType = WSTrust13Constants.RequestTypes.Issue, 
           AppliesTo = new EndpointAddress(realm), 
           KeyType = KeyTypes.Bearer, 
          }; 

      channel = (WSTrustChannel)factory.CreateChannel(); 

      return channel.Issue(rst); 
     } 
     finally 
     { 
      if (channel != null) 
      { 
       channel.Abort(); 
      } 

      factory.Abort(); 
     } 
    } 

一旦你有,你可以使用LINQ到XML或WIF得到ClaimsIdentity出SecurityToken的令牌。確保您在客戶端和STS以及服務之間使用SSL。

您擁有的第二個選擇是依靠服務返回索賠列表。這是一個更多的請求,但您將在用戶登錄的同時執行此操作,然後緩存這些聲明,直到令牌過期。

public IEnumerable<Claim> GetUserClaims() { 
     // get Thread.CurrentPricinpal IClaimsIdentity and grab the claims 
} 
+0

非常感謝您的詳細代碼。我知道有很多部分我都不太瞭解。但是你的代碼對於指導我非常有幫助! :) – Gope 2012-07-16 13:54:48

+0

這正是我正在尋找的 - 從桌面應用程序獲取授予用戶名/密碼的令牌。但是,當我運行這個時,我一直從服務器獲得「(405)方法不允許」。任何指針? – atlantis 2013-04-05 07:54:50

0

我不確定您使用的STS,但通常(例如,使用AD FS 2.0),您將使用WS-Trust連接到STS Web服務。這是主動聯合與被動聯合。

看看實驗室4 here的一些樣品如何做到這一點。

+0

謝謝你的回答。我知道STS(在我的例子中是SelfSTS的初學者)提供了一個WS-Trust端點,但它不像調用一個簡單的http WCF端點。這就是爲什麼我要求更多的指導。 – Gope 2012-07-16 13:51:01

+0

關於實驗室:也許我正在監督這一點,但這更多的是關於如何使用WIF從應用程序交談到wcf服務,不是嗎?我正在尋找的是獲取客戶端內使用的聲明以啓用/禁用控件。 – Gope 2012-07-16 14:00:07