質問
現在、Tokensを発行するためのパッシブSTS、SilverlightアプリケーションのWCFサービスを開催するWebサイトであるTokensを使用して、Federated Authenticationソリューションを実装しています。
これまでのところ私はできます:
- STSにリダイレクトされます
- ログインして、ウェブサイトにリダイレクトされます
- アクセスして、Webサイトにクレームを表示します
HttpContext.Current.User.Identity as IClaimsIdentity;
ウェブサイトの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セクションを設定して、請求suthenticationmanagerとrackathorizationmanagerの独自の実装を使用しました。
<service name="Rem.Ria.PatientModule.Web.WebService.PatientService">
<claimsAuthenticationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthenticationManager"/>
<claimsAuthorizationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthorizationManager"/>
</service>
私の請求監視マネージャーは、単にスレッドを設定することです。CurrentPrincipalは有効なプリンシパルが提供されています。
class RemClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public override IClaimsPrincipal Authenticate ( string resourceName, IClaimsPrincipal incomingPrincipal )
{
if ( incomingPrincipal.Identity.IsAuthenticated )
{
Thread.CurrentPrincipal = incomingPrincipal;
}
return incomingPrincipal;
}
}
}
問題は、私の請求承認マネージャーが呼び出されると、Context.Principal.Identityには請求と有効なアイデンティティが含まれておらず、Thread.CurrentPrincipalも含まれていないことです。
何か案は?
解決
セッションモジュールがこれを行うため、thread.currentPrincipalを設定する必要はありません。 httpcontext.current.userを介してアクセスする必要があります。これは、IISの2つの異なるモジュールであるため、通常、サービスにアクセスするスレッドとは異なるスレッドに設定されているためです。今後の本には、この例があります。 CODEPLEXサイト.
Hth
他のヒント
次のサンプルコードは、請求監視マネージャーを継承するサンプルクラスを示しています。次のIClaimsPrincipalを受け取るだけで、修正された名前のクレームを除き、クレームを通過します。これは、あなたの例のように、現在のスレッドに現在のプリンシパルを設定しません。
私のテストの実装は次のとおりです。
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 });
}
}