Преобразование токена Identity Foundation в ClaimsPrincipal

Я работаю над консольным приложением в качестве доказательства концепции аутентификации через AD FS. Код, который у меня есть до сих пор,

using System.IdentityModel.Protocols.WSTrust;
using System.IdentityModel.Tokens;
using System.IO;
using System.Linq;
using System.Security.Claims;
using System.ServiceModel;
using System.ServiceModel.Security;
using System.Xml;
using Thinktecture.IdentityModel.WSTrust;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var factory = new WSTrustChannelFactory(new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress("https://dcadfs.security.net/adfs/services/trust/13/windowsmixed"))
            {
                TrustVersion = TrustVersion.WSTrust13
            };

            var rst = new RequestSecurityToken
            {
                RequestType = RequestTypes.Issue,
                KeyType = KeyTypes.Bearer,
                AppliesTo = new EndpointReference("https://dcadfs.security.net/adfs/services/trust/13/windowsmixed")
            };

            var channel = factory.CreateChannel();
            var genericToken= channel.Issue(rst) as GenericXmlSecurityToken;

            if (genericToken != null)
            {
                var sh = new WindowsUserNameSecurityTokenHandler();
                //Next line errors with ID4065: Cannot read security token. Exepected elemt is username
                var token = sh.ReadToken(new XmlTextReader(new StringReader(genericToken.TokenXml.OuterXml)));
                var claimsPrincipal = new ClaimsPrincipal(sh.ValidateToken(token2).First());
            }           

        }
    }
}

Он не работает с ReadToken с ожидаемой ошибкой элемента имени, я думаю, что, вероятно, использую неправильный обработчик/неправильно его инициализирую?

Я также думаю, что мне не хватает пары других моментов

  1. Я ни в коем случае не идентифицирую AD FS, кто является проверяющей стороной.
  2. Я не был уверен, что установить для AppliesTo, поскольку я не использую службу, поэтому я установил конечную точку AD FS.

Любой совет по любому из них был бы замечательным.

Действительно изо всех сил пытается найти примеры этого за пределами подхода, основанного на WCF/конфигурации. Я пытаюсь получить все это в коде, чтобы лучше понять, как все это работает.


person Gavin    schedule 29.01.2013    source источник


Ответы (1)


1 и 2 связаны — AppliesTo указывает RP в ADFS.

Что возвращается, так это токен SAML, поэтому вам нужно использовать SamlSecurityTokenHandler для чтения токена (не WindowsUserName…).

person leastprivilege    schedule 30.01.2013