0

EncryptedAssertion を含む SAML2 トークンを WIF で処理しています。マークアップには「サブジェクト識別子キー」拡張プロパティが含まれていないため、WIF SecurityTokenHandler は LocalMachineStore/Personal から正しい X509 証明書を取得しようとして失敗します。

問題は、トークンの暗号化に使用される証明書に SKI 拡張機能が含まれていないことと、もちろんトークン生成コード (Java) がそれを必要としないことです。生成コードを変更する必要がないように、WIF SecuityTokenResolver で受信した SKI のトークンをチェックせず、ローカル ストア証明書を直接使用してトークンを復号化する方法はありますか?

4

1 に答える 1

4

最後に、カスタム SecurityTokenResolver を実装し、TryResolveSecurityKeyCore メソッドを実装しました。

コードは次のとおりです。

public class mySaml2SSOSecurityTokenResolver : SecurityTokenResolver
{
    List<SecurityToken> _tokens;

    public PortalSSOSecurityTokenResolver(List<SecurityToken> tokens)
    {
        _tokens = tokens;
    }
    protected override bool TryResolveSecurityKeyCore(System.IdentityModel.Tokens.SecurityKeyIdentifierClause keyIdentifierClause, out System.IdentityModel.Tokens.SecurityKey key)
    {
        var token = _tokens[0] as X509SecurityToken;

        var myCert = token.Certificate;

        key = null;

        try
        {

            var ekec = keyIdentifierClause as EncryptedKeyIdentifierClause;

            if (ekec != null)
            {

                switch (ekec.EncryptionMethod)
                {

                    case "http://www.w3.org/2001/04/xmlenc#rsa-1_5":
                        {
                            var encKey = ekec.GetEncryptedKey();

                            var rsa = myCert.PrivateKey as RSACryptoServiceProvider;

                            var decKey = rsa.Decrypt(encKey, false);

                            key = new InMemorySymmetricSecurityKey(decKey);

                            return true;

                        }

                }

                var data = ekec.GetEncryptedKey();

                var id = ekec.EncryptingKeyIdentifier;

            }

        }

        catch (Exception ex)
        {
           // Do something here            }

            return true;

    }

    protected override bool TryResolveTokenCore(System.IdentityModel.Tokens.SecurityKeyIdentifierClause keyIdentifierClause, out System.IdentityModel.Tokens.SecurityToken token)
    {
        throw new NotImplementedException();
    }

    protected override bool TryResolveTokenCore(System.IdentityModel.Tokens.SecurityKeyIdentifier keyIdentifier, out System.IdentityModel.Tokens.SecurityToken token)
    {
        throw new NotImplementedException();
    }
}

}

于 2012-08-28T13:47:34.163 に答える