我尝试使用ROPC使用客户端提供的用户名和密码来获取令牌。但是错误消息是“ parsing_wstrust_response_failed”。与描述here
的错误消息(最后一个错误)相同从此错误消息中,我了解到我的用户是联盟用户,无法使用此方法。还有其他方法可以使用用户名和密码为联盟用户获取令牌?
try
{
result = await app.AcquireTokenByUsernamePassword(scopes,
"joe@contoso.com",
securePassword)
.ExecuteAsync();
}
catch (MsalClientException ex) when (ex.ErrorCode=="parsing_wstrust_response_failed"){
}
答案 0 :(得分:2)
首先,警告:您确实不应在您的应用中使用用户名/密码。通常,它的安全性较差,并且会增加您将关联环境暴露于其中的风险。这也是一种脆弱的方法,因为您可能会发现Azure AD在将来的某个时候需要进行交互式登录,这可能对您来说非常不方便。
第二,澄清:AcquireTokenByUsernamePassword
不会总是使用资源所有者密码凭证(ROPC)OAuth 2.0流。当MSAL发现用户是联合域名的一部分时,如果联合身份提供者发布了包含支持此方法的端点的元数据交换文档,则库将尝试非交互式用户名/密码身份验证 。如果此请求成功,则MSAL将尝试将响应(由联合身份提供者发出)交换为来自Azure AD(由Azure AD发出)的普通令牌集。
因此,回答您的问题:这取决于。 可以与联盟用户一起使用AcquireTokenByUsernamePassword
。但是,它要求联合身份服务对此提供支持。 AD FS是the most common与Azure AD联合的IdP,它支持“用户名混合”端点。
答案 1 :(得分:1)
不。不可能。 您需要使用其他流程来处理身份验证。
中提到了此缺点答案 2 :(得分:0)
根据要构建的内容,可以改用AcquireTokenByIntegratedWindowsAuth()。我们的场景是我们需要一个无头控制台应用程序,以便能够将电子邮件和通知发送到Teams频道。我们也是联合的,因此用户名\密码身份验证将不起作用。但是,由于我们在Windows上运行,因此可以使用集成身份验证。
我已按照本指南获取访问令牌:https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Integrated-Windows-Authentication
我们的方案确实需要获得用户的一次性同意,因此控制台应用程序的用户运行时具有适当的权限。 https://login.microsoftonline.com/ {tenantId} /oauth2/v2.0/authorize?client_id= {clientId}&response_type = code&scope = {scopes}