繁体   English   中英

实施“资源所有者密码凭据授予”时出现的问题

[英]Issue when implementing “Resource Owner Password Credentials Grant”

我尝试在Azure AD方案上实施“资源所有者密码凭据授予”。

我有一个Web API(DemoWebApi)和一个控制台(DemoConsole)声明为本机应用程序。 我能够使“授权代码授予”和“客户端凭据授予”正常工作,但是“资源所有者密码凭据授予”遇到了一些问题。

首先,我阅读了以下内容: http : //www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/

尤其是NO MSA部分。

所以我在Azure AD租户中创建了一个用户,现在我收到以下错误消息:

用户或管理员不同意使用ID为'bd274da6-80f2-458a-b74b -...'的应用程序。 发送对此用户和资源的交互式授权请求。

我不知道该怎么办

这是我的源代码:

string authority = "https://login.microsoftonline.com/7dda5ce2-2fb6-4f82-bc27-..."; 

AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
UserPasswordCredential credentials = new UserPasswordCredential(login, password);
AuthenticationResult res = await authenticationContext.AcquireTokenAsync(webApiClientId, consoleClientId, credentials);

例如,如果您将其用作LoginController操作以提供自定义的登录屏幕,那么值得一读的是在我工作时遇到的一种情况。

即使对于不正确的密码也发出了资源所有者密码凭证流令牌

一次成功分配令牌后,即可获得正确的密码。

您可能需要调用登录控制器来获取访问令牌以对用户进行身份验证。 现在,当您第一次通过AuthenticationContext获取访问令牌(通过提供所有必需的信息,例如客户端ID,资源ID,租户,凭据)时,您再次想要获取访问令牌,但是这次用户提供了错误的密码但正确的客户端id,Azure AD仍然提供对象的访问令牌。 沃拉!!!! 我已经遇到了这个问题,并且已经制作了5-10次这种情况以确保这种情况确实发生。

基于对Azure AD的理解,我得出结论:Azure AD将访问令牌存储在其TokenCache中,并且每当AuthenticationContext对象请求访问令牌时,即使在验证传入的密码凭据之前,它也会首先查找缓存,尽管它肯定会针对发行了哪个令牌。 这是事情开始变得有趣的时候,您将意识到它们到底是如何为错误的密码提供访问令牌的(记住:这种情况是您第一次获得正确密码的访问令牌,然后是下次使用错误密码的情况下仍然可以访问)使用AuthenicationContext时的令牌)

如果您有类似的要求,要解决此可能的问题,您需要在从AcquireTokenAsync方法获取AuthenticationResult之后立即清除身份验证上下文对象的令牌缓存。

authenticationContext.TokenCache.Clear();

就是这样:)。

我猜这从未被记录过,并且我相信这对正在使用资源所有者凭证流来设计自定义登录页面的要求的任何人都会有所帮助。 尽管Azure严格建议使用它提供的其他身份验证流。

您需要提供更多信息来帮助我们重现此问题,例如,如何使用azure门户,powershell或visual studio注册应用程序。新添加的用户的用户类型是什么以及如何添加该用户。

如果直接传递用户名和密码,则用户没有任何同意的机会。 要解决此问题,您可以尝试在门户中授予该api的权限(最好使用管理员帐户登录):

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM