3

現在、トークンを発行するためのパッシブSTS、SilverlightアプリケーションをホストするWebサイト、およびSilverlightアプリのWCFサービスを使用してフェデレーション認証ソリューションを実装しています。

これまでのところ私はできる:

  • STSにリダイレクトされます
  • ログインしてWebサイトにリダイレクトされます
  • アクセスしてWebサイトにクレームを表示します HttpContext.Current.User.Identity as IClaimsIdentity;

Webサイトのweb.configに、必要な2つの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を設定するだけで、有効なプリンシパルが提供されます。

class RemClaimsAuthenticationManager : ClaimsAuthenticationManager
    {
        public override IClaimsPrincipal Authenticate ( string resourceName, IClaimsPrincipal incomingPrincipal )
        {

            if ( incomingPrincipal.Identity.IsAuthenticated )
            {
                Thread.CurrentPrincipal = incomingPrincipal;
            }
            return incomingPrincipal;
        }
    }
}

問題は、ClaimsAuthorizationManagerが呼び出されたときに、context.Principal.IdentityにClaimsを含む有効なIdentityが含まれておらず、Thread.CurrentPrincipalも含まれていないことです。

何か案は?

4

2 に答える 2

5

セッションモジュールがこれを行うため、 Thread.CurrentPrincipal を設定する必要はありません。IIS では 2 つの異なるモジュールであるため、Thread.Principal は通常、サービスにアクセスするスレッドとは異なるスレッドで設定されるため、HttpContext.Current.User を介してアクセスする必要があります。Codeplex サイトで確認できる近刊の本に、この例があります。

HTH

于 2011-05-05T22:20:51.250 に答える
1

次のサンプル コードは、ClaimsAuthenticationManager を継承するサンプル クラスを示しています。着信 IClaimsPrincipal を受け取るだけで、変更された Name クレームを除くクレームを通過します。あなたの例のように、これは現在のスレッドに 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 }); 
 }

}
于 2011-12-06T02:48:41.963 に答える