Domanda

Attualmente sto implementando una soluzione di autenticazione federata utilizzando: una ST passiva per l'emissione di token, un sito Web che ospita un'applicazione Silverlight e servizi WCF per l'app Silverlight.

Finora sono in grado:

  • Vieni reindirizzato alla STS
  • Accedi e ricevi il reindirizzamento al sito Web
  • Visualizza i reclami sul sito Web accedendoHttpContext.Current.User.Identity as IClaimsIdentity;

Sul web.config del sito Web, ho aggiunto i due moduli WIF necessari (sotto 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>

Ho anche configurato la sezione Microsoft.IdentityModel di Web.Config per utilizzare la mia implementazione di ClaimsAuthenticationManager e ClaimsathorizationManager.

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

Il mio manganziente di reclamo è semplicemente impostare il thread.CurrentPrincipal è un principale principale.

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

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

Il problema è che quando viene chiamato il mio manager del mandato, il contesto.principal.Identity non contiene un'identità valida con le affermazioni, e nemmeno il thread.currentprincipal.

Qualche idea?

È stato utile?

Soluzione

Non è necessario impostare il thread.CurrentPrincipal perché il modulo di sessione lo farà per te. Dovrai accedervi tramite httpcontext.current.user perché il thread.principal è di solito impostato su un thread diverso da quello che accede al tuo servizio perché si tratta di due moduli diversi in IIS. Ne abbiamo un esempio nel nostro prossimo libro che puoi controllare al nostro Sito codeplex.

Hth

Altri suggerimenti

Il seguente codice di esempio mostra una classe di esempio che eredita ClaimSauthenticationManager. Riceve solo l'ICLAIMSPRINCIPAL in arrivo e passa attraverso le affermazioni, tranne la richiesta di nome, che viene modificata. Ciò non imposta CurrentPrincipal sul thread corrente, come nel tuo esempio.

La mia implementazione del test è la seguente:

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top