Question

J'implémente actuellement une solution d'authentification fédérée en utilisant: une STS passive pour l'émission de jetons, un site Web hébergeant une application Silverlight et des services WCF pour l'application Silverlight.

Jusqu'à présent, je suis capable:

  • Être redirigé vers le STS
  • Connectez-vous et redirigez vers le site Web
  • Afficher les réclamations sur le site Web en accédantHttpContext.Current.User.Identity as IClaimsIdentity;

Sur le Web.config du site Web, j'ai ajouté les deux modules WIF nécessaires (sous 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>

J'ai également configuré la section Microsoft.IdentityModel du web.config pour utiliser ma propre implémentation de réclamation AuthenticationManager et de réclamation-référencementManager.

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

Ma réclamation AauthenticationManager est simplement en train de définir le thread.CurrentPrincipal est un principal valide est fourni.

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

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

Le problème est que lorsque mes affirmations AuthorizationManager sont appelées, le context.principal.identity ne contient pas d'identité valide avec les affirmations, et le thread.CurrentPrincipal.

Des idées?

Était-ce utile?

La solution

Vous n'avez pas besoin de définir le thread.CurrentPrincipal car le module de session le fera pour vous. Vous devrez y accéder via HttpContext.current.User car le thread.principal est généralement défini sur un thread différent de celui qui accéde à votre service, car il s'agit de deux modules différents dans IIS. Nous en avons un exemple dans notre prochain livre que vous pouvez consulter à notre Site de codeplex.

Hth

Autres conseils

L'exemple de code suivant montre un exemple de classe qui hérite de réclamation AauthenticationManager. Il reçoit simplement le nouveau iccensprincipal et passe par les réclamations, à l'exception de la revendication du nom, qui est modifiée. Cela ne définit pas le Principal actuel sur le thread actuel, comme dans votre exemple.

Ma mise en œuvre de test est la suivante:

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 }); 
 }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top