【发布时间】:2019-01-15 08:21:52
【问题描述】:
我已经阅读了很多文档,但可能遗漏了一些东西。我想要做的是将用户名和密码传递给 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获取访问令牌吗?
【问题讨论】:
-
可以,但需要手动操作,也有点危险。此外,用户帐户不能具有 MFA,也不能是联合用户/来宾。你的场景是什么,为什么要处理密码?
-
@juunas 这个想法是有一个客户端(比如,angular),它只调用 web api 方法,包括一个授权方法。这是个好主意吗?
-
您的客户端应用程序应该通过 OpenId Connect 进行身份验证。为您的 API 获取访问令牌,调用它,然后如果它需要调用更多 API,则将该令牌交换为另一个令牌。 OIDC 舞蹈有点复杂,但它比自己处理密码安全得多(+ 阻止使用 MFA)。
-
@juunas 你的意思是在客户端通过 JavaScript 获取令牌?
-
是的,使用 ADAL.JS 或 MSAL.JS,具体取决于您使用的是 v1 还是 v2 端点。
标签: c# asp.net-core asp.net-web-api2 authorization azure-active-directory