【问题标题】:Make OAuth 2 Authorization Code Grant/Flow without user intervention无需用户干预即可进行 OAuth 2 授权代码授予/流程
【发布时间】:2020-02-21 14:11:23
【问题描述】:

尝试访问需要授予类型授权代码的 API 资源。我可以使用 Postman 及其授权工具取回有效的访问代码。

这涉及 Postman 弹出一个登录窗口,我在其中输入用户名和密码。

如何在没有用户干预的情况下完成这个纯粹有问题的任务?此授权类型似乎是唯一与此 API 一起使用的类型,因为当我尝试将 client_id 和 client_secret 与客户端凭据流一起使用时,我返回的访问令牌不允许我进入 API (401)。

我希望尽可能与代码无关。那就是我希望能够在不依赖在幕后做事的库的情况下做到这一点。理想情况下,一切都可以通过 HTTP 完成,就像 cURL 一样。

我有一些 C# 代码可以满足我的需求,但它使用了 Microsoft.IdentityModel.Clients.ActiveDirectory 库 (older version 2.29.0.1078)。好像可以通过传入用户名和密码来获取token

string userName = "johndoe";
string password = "mydoghasfleas";
string clientId = "7934579357js487dhj444";
clientBaseUrl = "https://mycompanyname.dynamics.com";
apiEndpointUrl = clientBaseUrl + "/data/resource=XYZ";

UserCredential credential = new UserCredential(userName, password);
AuthenticationContext authContext = new AuthenticationContext(apiEndpointUrl, false);
AuthenticationResult authResult = await authContext.AcquireTokenAsync(clientBaseUrl, clientID, credential);

我想弄清楚的是如何在不依赖 Microsoft.IdentityModel.Clients.ActiveDirectory 库的情况下做到这一点。

【问题讨论】:

    标签: c# oauth-2.0 postman microsoft-identity-platform


    【解决方案1】:

    如果它是您的 API 之一,正确的方法是在 API 中添加对客户端凭据身份验证和应用权限的支持。看到它可能是动态的,这对你来说可能是不可能的。在这种情况下,您可以使用授权代码流来获取用户的初始令牌,然后您可以在需要时使用刷新令牌来获取新令牌。在最后一种情况下,您可以使用资源所有者密码凭证流来获取令牌。但请注意,此流程不支持 MFA 等。

    【讨论】:

    • 感谢您的详细回复。你是对的,它是 Dynamic 365,我无法控制环境。当您说 MFA 时,您指的是多因素身份验证吗?当您说“在最终情况下”时,我有点困惑,因为您描述了两种不同的流程。授权代码流和资源所有者密码凭证流。假设我不想使用外部库,您认为选择哪个更好?
    • 授权码流+刷新令牌流是更安全的选择。它还允许用户帐户具有多重身份验证。 ROPC 流更易于实现,它是对 Azure AD 令牌端点的 HTTP 调用,它为您提供令牌以换取用户 + 应用程序凭据。它的缺点是您正在处理用户密码+该用户帐户无法启用多因素身份验证。 Dynamics 肯定会支持这两种流,它不知道使用什么流来获取令牌。它只关心令牌中有用户信息。
    • 对于 authz 代码流,您确实需要一个库(或冒着实施错误的风险)。 ROPC 非常简单:docs.microsoft.com/en-us/azure/active-directory/develop/….
    • 客户端凭据流用于机器对机器的通信。但问题似乎是用户到机器的通信(使用用户凭据)。为什么推荐客户端凭据流?
    • 如果一个人想在没有用户交互的情况下连接到一个API,那通常是服务到服务的通信。 Dynamics 不支持此功能,因此无法选择。
    【解决方案2】:

    Hackish:您可以进行 UI 解析,然后模仿标准用户登录过程

    正确的方法是使用更好的流量,这是使用过的 IdP 所允许的,例如直接授予流程(资源所有者密码凭据授予流程)`。

    【讨论】:

    • 我可以看到它使用 Microsoft.IdentityModel.Clients.ActiveDirectory 库(更新的原始问题)工作,所以它必须可以在没有屏幕抓取的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2014-11-04
    • 2016-10-15
    • 2019-10-23
    • 2016-06-17
    • 2020-10-15
    相关资源
    最近更新 更多