首页 > 解决方案 > 通过 web api 授权 azure 活动目录

问题描述

我已经阅读了很多文档,但可能错过了一些东西。我想要做的是将用户名和密码传递给 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 clieant 中工作,但是当我将它移动到我的 WebAPI 应用程序时,它给了我

MsalServiceException:AADSTS70002:请求正文必须包含以下参数:“client_secret 或 client_assertion”

以这种方式无法从 web api 获取访问令牌吗?

标签: c#asp.net-coreasp.net-web-api2authorizationazure-active-directory

解决方案


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

有关如何使用 ADAL .NET 通过用户名/密码对用户进行身份验证的更多信息,请参阅本文Constraints & Limitations。尤其是部分。

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

如果您使用的是 Azure AD v2.0 端点,您应该使用 Microsoft Authentication Library (MSAL),请点击此处 查看代码示例。


推荐阅读