Получение токена SAML из службы токенов безопасности в Windows XP - без использования WIF

Я пытаюсь получить токен SAML для моего пользователя в клиентском приложении WPF, которое должно работать в Windows-XP и выше. Я получаю SAML от своего провайдера идентификации с помощью WS-Trust и передаю его службе управления доступом Azure, которая возвращает мне простой веб-токен с использованием O-Auth, который я использую для аутентификации пользователя на клиенте и выполнения вызовов безопасного API на Azure, который доверяет ACS.

Мой код использует WIF (Windows Identity Foundation) и отлично работает в операционных системах выше Windows-XP. Единственные примеры, которые я видел, используют WIF для запроса токенов SAML из службы токенов безопасности, но WIF не поддерживается в windows-xp, в результате чего я застрял. Я попытался провести какое-то исследование, но не смог найти способ реализовать вышеуказанный сценарий без использования WIF. Есть ли способ сделать это на клиенте Windows XP? Если нет, то что я должен делать по-другому?

Код, который я использую для получения токенов:

// GetSamlToken из STS для области ACS с использованием UserCredential, используется WIF

    private SecurityToken GetSamlToken(string realm, string stsEndpoint, UserCredential userCredential)
    {
        Logger.Info("Getting Saml Token from Identity provider...");

        using (var factory = new WSTrustChannelFactory(new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(new Uri(stsEndpoint))))
        {
            factory.Credentials.UserName.UserName = userCredential.UserName;
            factory.Credentials.UserName.Password = userCredential.Password;
            factory.TrustVersion = TrustVersion.WSTrust13;

            WSTrustChannel channel = null;

            try
            {
                var rst = new RequestSecurityToken
                    {
                        RequestType = WSTrust13Constants.RequestTypes.Issue,
                        AppliesTo = new EndpointAddress(realm),
                        KeyType = KeyTypes.Bearer,
                    };

                channel = (WSTrustChannel)factory.CreateChannel();

                RequestSecurityTokenResponse response;
                var token = channel.Issue(rst, out response);

                Logger.Info("Got Saml Token from Identity provider.");

                return token;
            }
            finally
            {
                if (channel != null)
                {
                    channel.Abort();
                }

                factory.Abort();
            }
        }
    }

// Получает OAuthToken из точки обслуживания ACS, используя xmlSamlToken, полученный из STS.

    private NameValueCollection GetOAuthToken(string xmlSamlToken, string serviceEndpoint, string acsRelyingParty)
    {
        Logger.Info("Passing Saml token to ACS...");
        WebClient client = new WebClient { BaseAddress = serviceEndpoint };

        var values = new NameValueCollection
                         {
                             { "grant_type", "urn:oasis:names:tc:SAML:2.0:assertion" }, 
                             { "assertion", xmlSamlToken },
                             { "scope", acsRelyingParty }

                         };

        byte[] acsTokenResponse = client.UploadValues("v2/OAuth2-13", "POST", values);
        string acsToken = Encoding.UTF8.GetString(acsTokenResponse);
        var tokens = new NameValueCollection();
        var parsed = new JavaScriptSerializer().DeserializeObject(acsToken) as Dictionary<string, object>;
        Logger.Info("Parsed OAuth token.");

        foreach (var item in parsed)
        {
            tokens.Add(item.Key, item.Value.ToString());
        }

        Logger.Info("Returning OAuth token.");
        return tokens;
    }

0 ответов

Другие вопросы по тегам