Запрос токена STS через SAML с паролями, содержащими специальные символы - PullRequest
6 голосов
/ 22 января 2020

Редактировать: я заметил, что ошибка возникает не только для пяти XML зарезервированных символов, но и для других специальных символов.

У меня проблема с запросом SAML Я использую для получения токена STS.

Запрос SAML подтверждается в XML. Если пароль, отправленный с запросом, содержит символ, зарезервированный XML, то вход в систему завершится неудачно. Я пытался экранировать символы (& = &) или использовать CDATA

(lBuilder.Append('<o:Password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"><![CDATA[').Append(lPassword).Append(']]></o:Password>');)

, но, очевидно, пароль не распознается правильно, и вход по-прежнему не удается. Если я использую CDATA, даже логин с действительным паролем, который иначе работает, терпит неудачу. Запрос отправляется с помощью почтовой команды на номер https://login.microsoftonline.com/RST2.srf (cDefaultSTS).

Есть ли способ правильно экранировать специальные символы в паролях без конфликтов? Код написан на Delphi, и я использую следующие настройки клиента для отправки команды post (lSAMLRequestStream содержит запрос в формате XML).

lConnection.Client.Accept := '*/*';
lConnection.Client.AcceptLanguage := 'en-US';
lConnection.Client.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)';
lConnection.Client.ContentType := 'application/soap+xml';
lConnection.Client.HandleRedirects := True;
lConnection.Client.AcceptEncoding := '';
lSTSResponse := lConnection.Post(cDefaultSTS, lSAMLRequestStream);

Я пробовал то же самое в C#, используя библиотека Microsoft.SharePoint, но аутентификация по-прежнему не проходит, если пароль содержит один из зарезервированных символов. Побег также не работает здесь.

using (ClientContext clientContext = new ClientContext("https:mysite@sharepoint.com"))
{
  var passWord = new SecureString();
  string passwrd = "Password&";

  string encodedXml = HttpUtility.HtmlEncode(passwrd);

  foreach (char c in encodedXml.ToCharArray()) passWord.AppendChar(c);

  clientContext.Credentials = new SharePointOnlineCredentials("username@SharePoint.com",passWord);

   Web web = clientContext.Web;
   Console.WriteLine(clientContext.Site);
   clientContext.Load(web);

   clientContext.ExecuteQuery();

   Console.WriteLine(web.Title);
   Console.ReadLine();
}

1 Ответ

0 голосов
/ 27 января 2020

Выход через CDATA-тег на самом деле был решением и работает. У меня просто была дополнительная проблема с тестовой учетной записью, которую я использовал, из-за которой все выглядело так, как будто она все еще не работает из-за пароля. Код c#, кстати, не требует дополнительного выхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...