实施 "Resource Owner Password Credentials Grant" 时出现问题
Issue when implementing "Resource Owner Password Credentials Grant"
我尝试在 Azure AD 场景中实施 "Resource Owner Password Credentials Grant"。
我有一个 Web api (DemoWebApi) 和一个声明为本机应用程序的控制台 (DemoConsole)。
我能够使 "Authorization Code Grant" 和 "Client Credentials Grant" 正常工作,但我遇到了 "Resource Owner Password Credentials Grant".
的一些问题
尤其是 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);
您需要提供更多信息来帮助我们重现问题,例如,您如何注册应用程序,使用 Azure 门户、powershell 或 visual studio.What 是新添加用户的用户类型和你如何添加那个用户。
如果直接传递用户名和密码,用户将没有任何表示同意的机会。要解决该问题,您可以尝试在门户中为 api 授予权限(最好使用管理员帐户登录):
如果您将它用作例如 LoginController 操作以提供您的自定义登录屏幕,那么值得阅读我在处理它时遇到的一个场景。
即使密码不正确也颁发了资源所有者密码凭据流令牌
在一次成功分配正确密码的令牌后。
您可能需要调用登录控制器来获取访问令牌才能对用户进行身份验证。现在,当您第一次通过 AuthenticationContext 获取访问令牌时(通过提供所有必需的信息,例如客户端 ID、资源 ID、租户、凭据),您再次想要获取访问令牌,但这次用户提供了错误的密码,但提供了正确的客户端id ,Azure AD 仍然提供对象的访问令牌。沃拉!!!!
我遇到过这个问题,并且我已经制作了 5-10 次这种情况以确保这确实发生了。
根据我对 Azure AD 的理解,我得出的结论是 Azure AD 将访问令牌存储在其 TokenCache 中,并且每当 AuthenticationContext 对象请求访问令牌时,它甚至在验证传入的密码凭据之前都会首先查找缓存,尽管它肯定会查找客户端 ID发行了哪个令牌。这是事情开始变得有趣的时候,你会意识到他们到底是如何为错误的密码提供访问令牌的(记住:场景是你第一次获得正确密码的访问令牌,然后下次使用错误的密码你仍然可以访问使用 AuthenicationContext 时的令牌)
解决方案
如果您有类似的要求,要解决这个可能的问题,您需要在从 AcquireTokenAsync 方法获取 AuthenticationResult 后立即清除身份验证上下文对象的令牌缓存。
authenticationContext.TokenCache.Clear();
就是这样:)。
我猜这从未被记录在案,我相信这对任何正在处理此类需求以使用资源所有者凭据流设计自定义登录页面的人都会有所帮助。尽管 Azure 严格建议使用它提供的其他身份验证流程。
我尝试在 Azure AD 场景中实施 "Resource Owner Password Credentials Grant"。
我有一个 Web api (DemoWebApi) 和一个声明为本机应用程序的控制台 (DemoConsole)。 我能够使 "Authorization Code Grant" 和 "Client Credentials Grant" 正常工作,但我遇到了 "Resource Owner Password Credentials Grant".
的一些问题尤其是 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);
您需要提供更多信息来帮助我们重现问题,例如,您如何注册应用程序,使用 Azure 门户、powershell 或 visual studio.What 是新添加用户的用户类型和你如何添加那个用户。
如果直接传递用户名和密码,用户将没有任何表示同意的机会。要解决该问题,您可以尝试在门户中为 api 授予权限(最好使用管理员帐户登录):
如果您将它用作例如 LoginController 操作以提供您的自定义登录屏幕,那么值得阅读我在处理它时遇到的一个场景。
即使密码不正确也颁发了资源所有者密码凭据流令牌
在一次成功分配正确密码的令牌后。
您可能需要调用登录控制器来获取访问令牌才能对用户进行身份验证。现在,当您第一次通过 AuthenticationContext 获取访问令牌时(通过提供所有必需的信息,例如客户端 ID、资源 ID、租户、凭据),您再次想要获取访问令牌,但这次用户提供了错误的密码,但提供了正确的客户端id ,Azure AD 仍然提供对象的访问令牌。沃拉!!!! 我遇到过这个问题,并且我已经制作了 5-10 次这种情况以确保这确实发生了。
根据我对 Azure AD 的理解,我得出的结论是 Azure AD 将访问令牌存储在其 TokenCache 中,并且每当 AuthenticationContext 对象请求访问令牌时,它甚至在验证传入的密码凭据之前都会首先查找缓存,尽管它肯定会查找客户端 ID发行了哪个令牌。这是事情开始变得有趣的时候,你会意识到他们到底是如何为错误的密码提供访问令牌的(记住:场景是你第一次获得正确密码的访问令牌,然后下次使用错误的密码你仍然可以访问使用 AuthenicationContext 时的令牌) 解决方案如果您有类似的要求,要解决这个可能的问题,您需要在从 AcquireTokenAsync 方法获取 AuthenticationResult 后立即清除身份验证上下文对象的令牌缓存。
authenticationContext.TokenCache.Clear();
就是这样:)。
我猜这从未被记录在案,我相信这对任何正在处理此类需求以使用资源所有者凭据流设计自定义登录页面的人都会有所帮助。尽管 Azure 严格建议使用它提供的其他身份验证流程。