通过 web api 对 azure active directory 的授权

Authorization to azure active directory through web api

我已经阅读了很多文档,但可能遗漏了一些内容。我想做的是将用户名和密码传递给 Web API,获取令牌作为响应并使用它来访问 Web 的其他安全部分 API(非交互式授权)

我发现可以只使用本机客户端(桌面、移动应用程序)

List<string> scopes = new List<string>()
{
    "https://mydomain.onmicrosoft.com/myapp/access-as_user"
};
string clientId = _azureAdOptions.Value.ClientId;
string aadInstance = "https://login.microsoftonline.com/{0}/v2.0";
string tanent = "organizations";
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tanent);

var secureStringPass = new NetworkCredential("", pass).SecurePassword;
PublicClientApplication _app = new PublicClientApplication(clientId, authority);
var result = await _app.AcquireTokenByUsernamePasswordAsync(scopes, usr, secureStringPass);

上面的代码在 natove 客户端中工作,但是当我将它移动到我的 WebAPI 应用程序时,它给了我

MsalServiceException: AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'

是否无法通过这种方式从 Web api 获取访问令牌?

正如@juunas 所说,我们通常只使用来自受 Azure AD 保护的本机客户端的资源所有者流。机密客户端(例如网站)不能使用直接用户凭据。

请参阅 this article 以了解有关如何使用 ADAL .NET 通过 username/password 对用户进行身份验证的更多信息。尤其是 Constraints & Limitations 部分。

在 SPA 场景中,您可以使用 Azure AD 身份验证库 (ADAL) 对用户进行身份验证并获取访问令牌以访问您在 Azure AD V1.0 中的 Web api。请点击 here 查看代码示例。

如果您使用的是 Azure AD v2.0 终结点,则应使用 Microsoft 身份验证库 (MSAL),请单击 here 查看代码示例。