使用 OAuth 针对 Microsoft Dataverse 进行身份验证
Microsoft Dataverse 使用 OAuth 2.0 作为其身份验证标准。 OAuth 2.0 提供了一个行业标准,用于对客户端应用程序进行身份验证并授予它们访问资源的权限。
身份验证与授权
身份验证是验证用户或流程标识的过程或操作。 Microsoft 执行本验证流程的解决方案为 Microsoft Entra ID。 Entra ID 支持通过许多选项验证用户或流程的标识。 将您的标识提供者抽象化可以很好地分离隐患,因为管理用户名和密码可能是一个困难(且有风险)的过程。
注意
Microsoft Entra ID 是 Azure Active Directory 的新名称。 所有许可和功能保持不变。
授权是验证经过身份验证的用户是否有权 访问资源。 目前,Dataverse 授权处于 Entra ID 租户级别,而具体权限的管理则基于当前登录用户委派给应用程序。 因此,您不会使用 OAuth 2.0 来管理应用级别的安全性,而是通过 Dataverse 安全角色和通过 Power Apps 管理中心分配给用户的权限来管理。
如需详细了解身份验证和授权的概念,请参阅身份验证基础知识。
在 Entra ID 中注册 Dataverse 应用
要成功连接到您的 Dataverse,您必须先在 Entra ID 注册一个应用,该操作可在 Azure 门户中完成。 根据您要创建的应用的类型,有一些不同的设置可供您配置(Web 应用与在设备上本地安装的本机应用)。 有关每种类型所需的设置的详细信息,请参阅应用注册的类型。
要在 Entra ID 中注册应用,您可以转到 Entra ID (Azure Active Directory) 菜单边栏的应用注册部分,然后选择新建注册。
指定应用的名称以及您需要哪种类型的帐户访问权限。 如果您注册的是 Web 应用,请通过转到身份验证部分、将类型设置为 Web,然后输入重定向 URI,可以指定重定向 URI。
以下列表汇总了不同帐户类型的使用场合:
仅本组织目录中的帐户(单一租户)
您的目录中的所有用户和来宾帐户都可以使用您的应用程序或 API。
目标受众是组织内部人员时使用本选项。
任何组织目录中的帐户(任何 Entra ID 目录 - 多组织)
具有来自 Microsoft 的工作或学校帐户的所有用户都可以使用您的应用程序或 API,包括使用 Microsoft 365 的学校和企业。
目标受众是企业或教育客户并启用多组织时使用本选项。
任何组织目录(任何 Entra ID 目录 - 多组织)和个人 Microsoft 帐户(例如 Skype 和 Xbox)中的帐户
具有工作、学校或个人 Microsoft 帐户的所有用户都可以使用您的应用程序或 API。 它包括使用 Microsoft 365 和个人帐户登录 Xbox 和 Skype 等服务的学校和企业。
根据应用程序设置的复杂性,您可能需要配置其他身份验证设置。 有关如何完成本任务的步骤,请参考 Entra ID 文档。
使用 Web API 访问 Dataverse
对 Dataverse 的所有访问都是在登录用户的上下文中完成的。 这可以是使用服务器到服务器 (S2S) 身份验证的普通交互式用户或非交互式用户。
当某个应用程序代表交互用户访问 Dataverse 时,注册的应用程序必须配置 API 权限,以使用委派权限访问 Dataverse。 当应用程序直接访问 Dataverse 时,必须在 Dataverse 中创建与 Entra ID 应用程序注册相关联的应用程序用户。 使用 S2S 身份验证时,不需要 Dataverse API 委派权限。
在所有情况下,经过身份验证的用户必须具有与允许使用 Web API 执行操作的用户相关联的 Dataverse 安全角色。
配置 API 权限
如果您的应用程序将代表登录用户访问 Dataverse,请转到已注册应用程序上的 API 权限选项卡,并确保您的应用程序被授予对 Dataverse 环境的用户模拟访问权限。
标签上显示 Dynamics CRM,这是 Dataverse 前身产品的旧有名称。
配置 Dataverse 应用程序用户
使用 S2S 身份验证时,必须在每个 Dataverse 环境中配置 Dataverse 应用程序用户,您将使用 Web API 进行访问。
Dataverse 应用程序用户的配置是在 Power Platform 管理中心中以系统管理员身份完成的。
您可以从管理中心执行以下步骤:
创建新的应用程序用户
将应用程序用户与 Entra ID 应用或托管标识关联
配置将应用哪些 Dataverse 安全角色
有关更详细的分步审查,请参阅在 Power Platform 管理中心中管理应用程序用户。
使用身份验证库进行连接
注册应用程序后,使用 Microsoft 标识平台身份验证库之一执行身份验证并获取访问令牌以供 Web API 使用。
以下代码节选自使用 Microsoft 身份验证库 (MSAL) 的增强型快速入门示例。 以下 OAuthMessageHandler 类实现派生自 DelegatingHandler 的类,该类将传递给 HttpClient 的构造函数。 此处理程序将允许您覆盖 HttpClient.SendAsync 方法,以便每次 Http 客户端发送请求时,AcquireToken* 方法调用都会刷新访问令牌。
class OAuthMessageHandler : DelegatingHandler
{
private AuthenticationHeaderValue authHeader;
public OAuthMessageHandler(string serviceUrl, string clientId, string redirectUrl, string username, string password, HttpMessageHandler innerHandler)
: base(innerHandler)
{
//Build Microsoft.Identity.Client (MSAL) OAuth Token Request
var clientApplication = PublicClientApplicationBuilder.Create(clientId)
.WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
.WithRedirectUri(redirectUrl)
.Build();
var scope = serviceUrl + "//.default";
string[] scopes = { scope };
AuthenticationResult authBuilderResult;
if (username != string.Empty && password != string.Empty)
{
//Make silent Microsoft.Identity.Client (MSAL) OAuth Token Request
var securePassword = new SecureString();
foreach (char ch in password) securePassword.AppendChar(ch);
authBuilderResult = clientApplication.AcquireTokenByUsernamePassword(scopes, username, securePassword).ExecuteAsync().Result;
}
else
{
//Popup authentication dialog box to get token
authBuilderResult = clientApplication.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
}
//Note that an Entra ID access token has a finite lifetime, default expiration is 60 minutes.
authHeader = new AuthenticationHeaderValue("Bearer", authBuilderResult.AccessToken);
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
request.Headers.Authorization = authHeader;
return base.SendAsync(request, cancellationToken);
}
}
然后,您可以有一个帮助程序方法来使用处理程序获取 HttpClient 实例:
static HttpClient GetHttpClient(string url, string clientId, string redirectUrl, string version = "v9.2")
{
try
{
HttpMessageHandler messageHandler = new OAuthMessageHandler(url, clientId, redirectUrl, "", "",
new HttpClientHandler());
HttpClient httpClient = new HttpClient(messageHandler)
{
BaseAddress = new Uri(string.Format("{0}/api/data/{1}/", url, version)),
Timeout = new TimeSpan(0, 2, 0) //2 minutes
};
return httpClient;
}
catch (Exception)
{
throw;
}
}
最后,使用客户端实例进行 Web API 调用:
using (HttpClient client = GetHttpClient("https://yourenvname.api.crm.dynamics.com", "51f81489-12ee-4a9e-aaae-a2591f45987d", "http://localhost:8080"))
{
// Use the WhoAmI function
var response = client.GetAsync("WhoAmI").Result;
if (response.IsSuccessStatusCode)
{
//Get the response content and parse it.
JObject body = JObject.Parse(response.Content.ReadAsStringAsync().Result);
Guid userId = (Guid)body["UserId"];
Console.WriteLine("Your UserId is {0}", userId);
}
else
{
Console.WriteLine("The request failed with a status of '{0}'", response.ReasonPhrase);
}
Console.WriteLine("Press any key to exit.");
Console.ReadLine();
}
您现在应该具有可成功连接到您的 Dataverse 环境的已注册应用。 您还有一个简单示例,用于连接并使用注册应用以访问 Web API 操作。