2010-08-10 16 views
3

我目前正在實施一個聯合身份驗證解決方案,使用: 一個被動STS用於發佈令牌,一個託管Silverlight應用程序的網站和Silverlight應用程序的WCF服務。ClaimsPrincipal在它到達WCF服務時爲空

到目前爲止我能:

  • 重定向到STS
  • 登錄並獲得通過訪問 HttpContext.Current.User.Identity as IClaimsIdentity;

重定向到網站

  • 顯示在網站上的權利在網站的web.config中,我添加了兩個需要的WIF模塊(在IIS 7下)

    <modules runAllManagedModulesForAllRequests="true"> 
    
         <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/> 
         <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/> 
    
        </modules> 
    

    我還配置了web.config的Microsoft.IdentityModel部分,以使用我自己的ClaimsAuthenticationManager和ClaimsAthorizationManager實現。

    <service name="Rem.Ria.PatientModule.Web.WebService.PatientService"> 
         <claimsAuthenticationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthenticationManager"/> 
         <claimsAuthorizationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthorizationManager"/> 
         </service> 
    

    我的ClaimsAuthenticationMAnager是簡單的設置Thread.CurrentPrincipal是一個有效的Principal被提供。

    class RemClaimsAuthenticationManager : ClaimsAuthenticationManager 
        { 
         public override IClaimsPrincipal Authenticate (string resourceName, IClaimsPrincipal incomingPrincipal) 
         { 
    
          if (incomingPrincipal.Identity.IsAuthenticated) 
          { 
           Thread.CurrentPrincipal = incomingPrincipal; 
          } 
          return incomingPrincipal; 
         } 
        } 
    } 
    

    的問題是,當我的ClaimsAuthorizationManager被調用時,context.Principal.Identity不包含與權利要求中的有效身份證件,而且也沒有在Thread.CurrentPrincipal中。

    任何想法?

  • 回答

    5

    您不需要設置Thread.CurrentPrincipal,因爲會話模塊將爲您執行此操作。您將需要通過HttpContext.Current.User訪問它,因爲Thread.Principal通常設置在與訪問服務的線程不同的線程上,因爲它是IIS中的兩個不同模塊。在我們即將出版的書中,我們有一個例子,您可以在我們的Codeplex Site查看。

    HTH

    1

    以下示例代碼顯示了繼承ClaimsAuthenticationManager的示例類。它只是接收傳入的IClaimsPrincipal並通過索賠,除了已修改的名稱聲明外。這不會像當前例子那樣在當前線程上設置CurrentPrincipal。

    我的測試實現如下:

    public class CustomClaimsAuthenticationManager : ClaimsAuthenticationManager 
    { 
    public CustomClaimsAuthenticationManager() 
    { 
    
    } 
    
    public override IClaimsPrincipal Authenticate(string resourceName, 
    IClaimsPrincipal incomingPrincipal) 
    { 
        var outgoingIdentity = GetClaimsAsPassthrough(incomingPrincipal); 
        return outgoingIdentity; 
    } 
    
    private IClaimsPrincipal GetClaimsAsPassthrough(IClaimsPrincipal incomingPrincipal) 
    { 
        if (!incomingPrincipal.Identity.IsAuthenticated) 
        { 
         return incomingPrincipal; 
        } 
    
        var ingoingClaims = incomingPrincipal.Identity as IClaimsIdentity; 
    
        ClaimsIdentity outgoingIdentity = new ClaimsIdentity(new List<Claim> 
        { 
         new Claim(ClaimTypes.Name, (incomingPrincipal.Identity.Name + " 
         a very cool guy")) 
        }, incomingPrincipal.Identity.AuthenticationType); 
    
        foreach (var claim in ingoingClaims.Claims.Where(
        c => c.ClaimType != ClaimTypes.Name)) 
        { 
         outgoingIdentity.Claims.Add(claim.Copy()); 
        } 
    
        return new ClaimsPrincipal(new List<ClaimsIdentity> { outgoingIdentity }); 
    } 
    
    }