我在尝试序列化令牌缓存时遇到了一些问题,通过 MSAL 进行身份验证返回。我将不胜感激,因为我真的不明白我做错了什么。这是我们的情况/问题:
我们目前正在使用 ADAL 来允许用户从我们的桌面应用程序对其 SharePoint Online 帐户进行身份验证,但希望切换到 MSAL。
我们已经实现了两种可能的身份验证流程。一个 publicClientApplication,允许用户使用其当前活动的 Microsoft 凭据和 ConfidentialClientApplication 进行身份验证,允许使用证书进行身份验证,如您在以下代码的 catch 块中所见:
try
{
Debugger.Launch();
if (certificate != null)
{
IConfidentialClientApplication m_authContext = ConfidentialClientApplicationBuilder.Create(pClientID)
.WithTenantId(m_tenant).WithCertificate(certificate).WithRedirectUri(pClientRedirectURI).Build();
var accounts = await m_authContext.GetAccountsAsync();
authResult = await m_authContext.AcquireTokenSilent(m_scope, accounts.FirstOrDefault()).ExecuteAsync();
}
else
{
IPublicClientApplication m_authContext = PublicClientApplicationBuilder.Create(pClientID).WithTenantId(m_tenant).WithRedirectUri(pClientRedirectURI).Build();
var accounts = await m_authContext.GetAccountsAsync();
authResult = await m_authContext.AcquireTokenSilent(m_scope, accounts.FirstOrDefault()).ExecuteAsync();
}
}
catch
{
if (certificate != null)
{
IConfidentialClientApplication m_authContext = ConfidentialClientApplicationBuilder.Create(pClientID)
.WithTenantId(m_tenant).WithCertificate(certificate).WithRedirectUri(pClientRedirectURI).Build();
TokenCacheHelper.EnableSerialization(m_authContext.AppTokenCache);
authResult = await m_authContext.AcquireTokenForClient(m_scope).WithForceRefresh(true).ExecuteAsync();
}
else
{ …Run Code Online (Sandbox Code Playgroud) 编辑:我注意到错误不仅发生在五个 XML 保留字符上,还发生在其他特殊字符上。
我用于获取 STS 令牌的 SAML 请求有问题。
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,即使使用有效密码登录也会失败。请求通过 post 命令发送到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 …Run Code Online (Sandbox Code Playgroud)