2012-05-15 4 views
1

Чтобы подготовить мое приложение к использованию ADFS, мне нужно работать с федерацией . Теперь у нас есть решение с сервером с федеративными услугами, использующим WIF для обеспечения безопасности, у которого есть клиент, потребляющий эти услуги, и у нас есть и STS, где был введен пароль пользователя для идентификации пользователя.WIF, Federation и STS

Все работает нормально, все мои требования генерируются правильно, и я могу использовать их в своем приложении.

Теперь мы должны использовать ADFS в дополнение к нашему внутреннему IdentityProvider, я бы просто взял мои sts и разделил его между двумя частями, «провайдером федерации», вызванным клиентом и доверенным сервером, и частью, ответственной за аутентификацию Для этого я просто добавить следующий код в моем CustomSecurityTokenHandler в FederationProvider

UserNameSecurityToken userNameTokenFromRP = token as UserNameSecurityToken; 
WSTrustChannelFactory stsClient = new WSTrustChannelFactory("IdentityConfiguration"); 
stsClient.Credentials.UserName.UserName = userNameTokenFromRP.UserName; 
stsClient.Credentials.UserName.Password = userNameTokenFromRP.Password; 

IWSTrustChannelContract stsProxy = stsClient.CreateChannel(); 
RequestSecurityToken rst = new RequestSecurityToken(WSTrust13Constants.RequestTypes.Issue, WSTrust13Constants.KeyTypes.Symmetric); 
rst.AppliesTo = new System.ServiceModel.EndpointAddress("http://localhost:8010/FederationProvider.svc"); 
rst.Claims.Add(new RequestClaim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", false)); 
rst.Issuer = new System.ServiceModel.EndpointAddress("http://localhost:8020/IdentityProvider.svc"); 
rst.Lifetime = new Lifetime(DateTime.Now, DateTime.Now + new TimeSpan(0, 30, 0)); 
rst.TokenType = Microsoft.IdentityModel.Tokens.SecurityTokenTypes.OasisWssSaml11TokenProfile11; 
RequestSecurityTokenResponse rstr; 
var stsToken = stsProxy.Issue(rst, out rstr); 

и это в моем файле web.config:

<client> 
    <endpoint name="IdentityConfiguration" address="http://localhost:8020/IdentityProvider.svc" 
    binding="ws2007HttpBinding" bindingConfiguration="SecurityTokenBinding" 
    contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrustChannelContract"> 
    <identity> 
     <certificate encodedValue="MyEncodedValue" /> 
    </identity> 
    </endpoint> 
</client> 

на стороне идентичности я по-прежнему генерировать мои претензии так же, как я быть fore Проблема у меня есть в моем RSTR токен равен null, а tokenXML зашифрован, я не понимаю, как использовать федерацию в этом случае?

Если кто-то может мне помочь?

спасибо за чтение мне

Ange

ответ

0

Наконец, я понимаю, что не хватает

Я должен создать маркер обработчик безопасности и распознаватель маркера

  GenericXmlSecurityToken augmentedToken = (GenericXmlSecurityToken) stsToken; 
      var tokenReader = new StringReader(augmentedToken.TokenXml.OuterXml); 
      var reader = XmlReader.Create(tokenReader); 

      SecurityTokenHandlerCollection handlers = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection(); 
      X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
      store.Open(OpenFlags.ReadOnly); 
      X509Certificate2Collection certificates = store.Certificates; 
      X509Certificate2 certificate = certificates.Find(X509FindType.FindByThumbprint, "MyThumbprint", true)[0]; 

      List<SecurityToken> serviceTokens = new List<SecurityToken>(); 
      serviceTokens.Add(new X509SecurityToken(certificate)); 
      SecurityTokenResolver serviceResolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(serviceTokens.AsReadOnly(), false); 
      handlers.Configuration.ServiceTokenResolver = serviceResolver; 
      handlers.Configuration.AudienceRestriction.AllowedAudienceUris. 
      Add(new Uri("http://localhost:8010/FederationProvider.svc")); 
      var registry = new ConfigurationBasedIssuerNameRegistry(); 
      registry.AddTrustedIssuer("Thumbprint", "http://localhost:8020/IdentityProvider.svc"); 
      handlers.Configuration.IssuerNameRegistry = registry; 

      var samlToken = handlers.ReadToken(reader); 
      IClaimsIdentity identity = handlers.ValidateToken(samlToken)[0]; 

его работает нормально и код исходит от alexthissen

Смежные вопросы