1

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. 証明書利用者が誰であるかをADFSに特定することはできません。
  2. サービスを使用していないため、AppliesToを何に設定すればよいかわからなかったため、ADFSエンドポイントに設定しました。

それらのいずれかに関するアドバイスは素晴らしいでしょう。

WCF/構成ベースのアプローチ以外でこの例を見つけるのに本当に苦労しています。すべてがどのように機能するかをよりよく理解できるように、すべてをコードにまとめようとしています。

4

1 に答える 1

1

1と2は関連しています-AppliesToはADFSでRPを指定します。

返されるのはSAMLトークンです。したがって、トークンを読み取るにはSamlSecurityTokenHandlerを使用する必要があります(WindowsUserNameではありません…)。

于 2013-01-30T06:06:53.853 に答える