Reclamación de reclamo es nulo cuando alcanza el servicio WCF
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 accediendo
HttpContext.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?
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 });
}
}