将Identity Foundation Token转换为ClaimsPrincipal

时间:2013-01-29 13:32:59

标签: wif adfs

我正在使用控制台应用程序作为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端点。
  3. 对这两方面的任何建议都会很棒。

    真的很难在WCF /基于配置的方法之外找到这个例子。我试图在代码中全部了解它,让我更好地理解它是如何工作的。

1 个答案:

答案 0 :(得分:1)

1和2相关 - AppliesTo在ADFS中指定RP。

返回的是SAML令牌 - 因此您需要使用SamlSecurityTokenHandler来读取令牌(而不是WindowsUserName ...)。