Редактировать: я заметил, что ошибка возникает не только для пяти 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();
}