我已经阅读了许多文档,但可能错过了一些东西。我要做的是将用户名和密码传递给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:请求正文必须包含 以下参数:“ client_secret或client_assertion”
是否可以通过这种方式从Web api获取访问令牌?
答案 0 :(得分:0)
正如@juunas所说,我们通常只使用来自受Azure AD保护的本机客户端的资源所有者流。机密客户端(例如网站)不能使用直接用户凭据。
有关如何使用ADAL .NET通过用户名/密码对用户进行身份验证的信息,请参阅this article。特别是Constraints & Limitations
部分。
在SPA方案中,您可以使用Azure AD身份验证库(ADAL)对用户进行身份验证并获取访问令牌以访问Azure AD V1.0中的Web api。请单击here获取代码示例。
如果使用的是Azure AD v2.0终结点,则应使用Microsoft身份验证库(MSAL),请单击here获取代码示例。