在没有用户干预的情况下制作 OAuth 2 授权码 Grant/Flow

Make OAuth 2 Authorization Code Grant/Flow without user intervention

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

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

如何在没有用户干预的情况下完全有问题地完成此操作?这种授权类型似乎是唯一适用于此 API 的授权类型,因为当我尝试将 client_id 和 client_secret 与客户端凭证流一起使用时,我取回的访问令牌却没有请允许我进入 API (401).

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

我有一些 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 库的情况下做到这一点。

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

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

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