Pregunta

Actualmente estoy implementando una solución de autenticación federada utilizando: un STS pasivo para emitir tokens, un sitio web que aloja una aplicación Silverlight y servicios WCF para la aplicación Silverlight.

Hasta ahora puedo:

  • Ser redirigido al STS
  • Iniciar sesión y redirigirse al sitio web
  • Muestre los reclamos en el sitio web accediendoHttpContext.Current.User.Identity as IClaimsIdentity;

En la web.config del sitio web, he agregado los dos módulos WIF necesarios (bajo 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>

También he configurado la sección Microsoft.IdentityModel de Web.Config para utilizar mi propia implementación de Reclamación de AtenticationManager y ReclamSathorizationManager.

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

Mi reclamación de AuthenticationManager simplemente está configurando el hilo. CurrentpriPripal es un principal válido que se proporciona.

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

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

El problema es que cuando se llama a mi managadora de reclamaciones, el context.prudipal.identity no contiene una identidad válida con las afirmaciones, y tampoco el hilo. Currentprincipal.

¿Algunas ideas?

¿Fue útil?

Solución

No necesita configurar el hilo. Deberá acceder a él a través de httpcontext.current.user porque el hilt.principal generalmente se establece en un hilo diferente al que accede a su servicio porque son dos módulos diferentes en IIS. Tenemos un ejemplo de esto en nuestro próximo libro que puede consultar en nuestro Sitio de CodePLEX.

Hth

Otros consejos

El siguiente código de muestra muestra una clase de muestra que hereda el AuthentaticationManager de la Atención. Simplemente recibe el IclaimeSprincipal entrante y pasa a través de las reclamaciones, excepto el reclamo de nombre, que se modifica. Esto no establece el CurrentPrincipal en el hilo actual, como en su ejemplo.

La implementación de mi prueba es la siguiente:

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top