Заключение претензии - это ноль, когда он достигает службы WCF

StackOverflow https://stackoverflow.com/questions/3450206

  •  27-09-2019
  •  | 
  •  

Вопрос

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

Пока я умею:

  • Перенаправляться на STS
  • Войти и перенаправить на сайт
  • Отображение претензий на веб-сайте, доступа к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. WideTityModel Web.config, чтобы использовать мою собственную реализацию требований требований и требований и претензии.

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

Мой претензия на претензии просто устанавливает Thread.CurrentPrincipal - это действительное принципал.

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

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

Проблема в том, что когда мой призванный к требованию называется Context.Principal.identitality не содержит действительной идентичности с претензиями, и ни один не делает нить. CurrentPrincipal.

Любые идеи?

Это было полезно?

Решение

Вам не нужно устанавливать тему .CurrentPrincipal, потому что сеансный модуль сделает это для вас. Вам нужно будет получить доступ к нему через httpContext.current.user, потому что нить.Принбина обычно устанавливается на другой поток, чем один доступ к вашему обслуживанию, потому что это два разных модуля в IIS. У нас есть пример этого в нашей предстоящей книге, которую вы можете проверить на нашем Сайт Кодепоэкс.

Емкость

Другие советы

Следующий пример код показывает образец класс, который наследует требования к требованиям. Это просто получает входящие ICLAIMSPRINCIPIPAL и проходит через претензии, за исключением претензии имени, который изменен. Это не устанавливает текущий типPrincipal на текущий поток, как в вашем примере.

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

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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top