【问题标题】:Unable to auth as user programmatically无法以编程方式作为用户身份验证
【发布时间】:2017-08-15 16:16:55
【问题描述】:

我正在使用以下代码(python,但这并不重要,使用powershell和invoke-webrequest得到相同的结果):

from msrestazure.azure_active_directory import UserPassCredentials
username = '%username%'
password = '%password%'
client_id = '{Azure AD Application GUID}'
secret_id = '{Azure AD Application secret}'
credentials = UserPassCredentials(username, password, client_id, secret_id)

这适用于一个租户中的用户,但不适用于另一个租户的用户并出现奇怪的错误:

msrest.exceptions.AuthenticationError: , InvalidGrantError: (invalid_grant) AADSTS70002:验证凭据时出错。 AADSTS50126:用户名或密码无效

我可以使用具有相同凭据的门户登录就好了。有问题的租户正在使用 AAD Sync 和 SSO,这会干扰吗?

如果是,我如何为此类 Azure AD 中的用户获取令牌?

【问题讨论】:

    标签: python azure authentication azure-active-directory adal


    【解决方案1】:

    我很确定在尝试使用 Azure AD 登录时使用资源所有者密码凭据授予的严重安全隐患。

    它还有一些问题/副作用:

    • 如果您的帐户启用了 MFA/条件访问,那么您将无法使用资源所有者密码凭据授予登录。时期。没有办法。
    • 如果您的域是federated(如您的情况),您将无法登录。如果您还进行密码哈希同步,则有可能登录,但我不确定这是否会有所帮助。

    最后,验证后端和非用户交互进程的最佳方法是使用Service Principal

    查看以下文档来源,详细了解 Azure AD 中的服务主体以及如何使用服务主体进行身份验证:

    【讨论】:

    • 所以我需要获取一个包含用户名的令牌,如何使用服务主体身份验证?
    • 涉及用户交互以向用户询问authorization - 授权码授予。然后使用刷新令牌(默认有效期为 90 天)更新您的访问令牌。如果授权过期 - 您必须再次要求。这是获取带有用户信息的令牌的正确方法。否则,如前所述 - 后端进程不代表真实用户 - 所以使用服务主体。
    猜你喜欢
    • 2017-04-30
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多