ClaimsPrincipal имеет значение null, когда достигает службы WCF.

В настоящее время я реализую решение федеративной аутентификации, используя: пассивную службу STS для выпуска токенов, веб-сайт, на котором размещено приложение Silverlight, и службы WCF для приложения Silverlight.

Пока я умею:

  • Перенаправляйтесь на СТС
  • Войдите и получите перенаправление на сайт
  • Отобразите претензии на веб-сайте, зайдя HttpContext.Current.User.Identity as IClaimsIdentity;

в web.config веб-сайта я добавил два необходимых модуля 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>

Я также настроил раздел Microsoft.IdentityModel файла web.config для использования моей собственной реализации ClaimsAuthenticationManager и ClaimsAthorizationManager.

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

Мой ClaimsAuthenticationMAnager просто устанавливает Thread.CurrentPrincipal - предоставляется действительный участник.

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

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

Проблема в том, что когда вызывается мой ClaimsAuthorizationManager, context.Principal.Identity не содержит действительного удостоверения с утверждениями, как и Thread.CurrentPrincipal.

Любые идеи?


person Claudio Sanchez    schedule 10.08.2010    source источник


Ответы (2)


Вам не нужно устанавливать Thread.CurrentPrincipal, потому что модуль сеанса сделает это за вас. Вам нужно будет получить к нему доступ через HttpContext.Current.User, потому что Thread.Principal обычно устанавливается в другом потоке, чем тот, который обращается к вашей службе, потому что это два разных модуля в IIS. У нас есть пример этого в нашей будущей книге, которую вы можете проверить на нашем сайте Codeplex.

HTH

person Scott Densmore    schedule 05.05.2011

В следующем примере кода показан образец класса, который наследует ClaimsAuthenticationManager. Он просто получает входящий IClaimsPrincipal и проходит через утверждения, за исключением утверждения Name, которое изменяется. Это не устанавливает CurrentPrincipal в текущем потоке, как в вашем примере.

Моя тестовая реализация выглядит следующим образом:

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

}
person Tore Aurstad    schedule 06.12.2011