使用AAD v2进行非交互式用户身份验证

时间:2018-01-31 08:33:54

标签: azure asp.net-web-api azure-active-directory

我们正在公开一个用ASP .net Core Web API编写的服务,并使用AAD V2和基于声明的身份验证。 我们的客户使用V2中支持的Microsoft和MSA帐户。

我们有一个要求消费者需要从Windows服务中使用我们的Web API。(非交互式) 我们知道AAD V2不支持资源所有者密码凭证。

我们尝试使用客户端秘密方法,但我们无法区分此方法的特定用户,因为我们没有获得UPN或唯一值。 如果我们可以在这种情况下使用替代方法,请告诉我们。

2 个答案:

答案 0 :(得分:0)

那么,

如果您需要从Windows服务进行身份验证,则会自动消除授权代码和ROPC流。仅仅因为您没有用户上下文。这就是为什么你也不需要ID令牌。在这种情况下,您只需要一个访问令牌。有interesting reading on the Auth0 blogs here

话虽如此,我建议您为使用WebAPI的每个 Windows服务客户端创建单独的应用程序注册。您还可以为开发人员门户中的每个应用程序自动“授予”对Web API的访问权限。

同时,您可以为用户交互流程保留单个“Web App”应用程序注册。仍然作为单独的应用程序注册与Web API授予。

再次 - 重新考虑仅使用访问令牌来访问您的Web API。

要关闭 - 我不确定v.2.0上是否支持客户端凭据流完全,但这绝对是可行的方法。

答案 1 :(得分:-1)

您可以静默获取用户令牌。您可以使用MSAL缓存并静默获取令牌。

这是一个例子:

您可以在此处再次使用MSAL从MSAL缓存中获取access_tokens。首先,将MSAL的using语句添加到此文件中。

using Microsoft.Identity.Client;

在Index操作中,使用MSAL的AcquireTokenSilentAsync方法获取可用于从待办事项列表服务中读取数据的access_token:

// ...
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").Value;
string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string authority = String.Format(CultureInfo.InvariantCulture, Startup.aadInstance, tenantID, string.Empty);
ClientCredential credential = new ClientCredential(Startup.clientId, Startup.clientSecret);

// Here you ask for a token using the web app's clientId as the scope, since the web app and service share the same clientId.
app = new ConfidentialClientApplication(Startup.clientId, redirectUri, credential, new NaiveSessionCache(userObjectID, this.HttpContext)){};
result = await app.AcquireTokenSilentAsync(new string[] { Startup.clientId });
// ...

.Net App的the source document。但它的方法也适用于.Net Core App。