快速入门:公共和机密客户端 (C#)

使用 MIP SDK 生成应用程序时,使用两种常见方案。 第一个方案中,用户直接针对Azure AD。 其次,应用程序使用应用机密或证书进行身份验证。

公共客户端应用程序

这些应用程序是桌面或移动应用程序,会提示用户进行身份验证。 用户直接连接到后端 MIP 服务。 在此方案中,应该使用身份验证库来确保用户可以登录到 Azure AD,满足任何多重或条件访问要求,并获取相应资源的 OAuth2 令牌。

有关详细信息,请参阅公共 客户端身份验证流文档

下面是一个快速代码提示,演示了使用 Microsoft 身份验证库和 MSAL Microsoft 信息保护 SDK 客户端应用程序的公共 () 。


public string AcquireToken(Identity identity, string authority, string resource, string claims)
{
     var authorityUri = new Uri(authority);
     // 
     authority = String.Format("https://{0}/{1}", authorityUri.Host, "<Tenant-GUID>");

     _app = PublicClientApplicationBuilder.Create("<Application-Id>")
                                          .WithAuthority(authority)
                                          .WithDefaultRedirectUri()
                                          .Build();

     var accounts = (_app.GetAccountsAsync())
                    .GetAwaiter()
                    .GetResult();

     // Append .default to the resource passed in to AcquireToken().     
     string[] scopes = new string[] { resource[resource.Length - 1].Equals('/') ? $"{resource}.default" : $"{resource}/.default" };
     var result = _app.AcquireTokenInteractive(scopes)
                      .WithAccount(accounts.FirstOrDefault())
                      .WithPrompt(Prompt.SelectAccount)
                      .ExecuteAsync()
                      .ConfigureAwait(false)
                      .GetAwaiter()
                      .GetResult();

     return result.AccessToken;
}

Tenant-GUID是租户的唯一租户 GUID Azure AD租户。 应用程序 ID是在门户上的应用程序注册Azure AD ID。

机密客户端应用程序

这些应用程序是基于云的或基于服务的应用程序,其中用户未直接连接到后端 MIP 服务。 该服务需要标记、保护或解密文件或其他数据。 在此方案中,应用程序必须存储证书或应用程序机密。 这些机密将用于身份验证,Azure AD机密获取后端 MIP 服务的令牌。 然后,它可以使用 MIP SDK 的委派功能代表用户保护或使用内容。

将 MIP SDK 与基于服务的应用程序集成需要使用客户端凭据授予流。 Microsoft 身份验证库 (MSAL) ,可以在类似于公共客户端应用程序中看到的模式中实现此方案。 本文简要介绍如何在 .NET 中更新 MIP SDK,以使用此流对基于服务 IAuthDelegate 的应用程序执行身份验证。 在发布时,没有适用于 C++ 的 MSAL 版本,但可以通过直接 REST 调用 实现 此流

有关详细信息,请参阅机密 客户端身份验证流文档

下面是一个快速代码提示,演示了使用 Microsoft 身份验证库和 MSAL Microsoft 信息保护 SDK 客户端应用程序的机密 (身份验证) 。 应用程序可以使用 AD 证书或客户端机密进行身份验证。

注意

请特别注意以下示例中的此行。

string[] scopes = new string[] { resource[resource.Length - 1].Equals('/') ? $"{resource}.default" : $"{resource}/.default" };

这会从提供给 方法的资源构造 MSAL AcquireToken() 范围。

MSAL 机密客户端示例

public string AcquireToken(Identity identity, string authority, string resource, string claim)
{
     AuthenticationResult result;
     var authorityUri = new Uri(authority);
     authority = string.Format("https://{0}/{1}", authorityUri.Host, "<Tenant-GUID>");

     // Certification Based Auth
     if (doCertAuth)
     {
          // Build ConfidentialClientApplication using certificate.
          _app = ConfidentialClientApplicationBuilder.Create("<Application-Id>")
               .WithCertificate(certificate) //Assumption here is Application passes a certificate created using certificate thumbprint
               .WithAuthority(new Uri(authority))
               .Build();
     }

     // Client secret based Auth
     else
     {
          // Build ConfidentialClientApplication using app secret
          _app = ConfidentialClientApplicationBuilder.Create("<Application-Id>")
               .WithClientSecret(clientSecret)
               .WithAuthority(new Uri(authority))
               .Build();
     }

     // Append .default to the resource passed in to AcquireToken().
     string[] scopes = new string[] { resource[resource.Length - 1].Equals('/') ? $"{resource}.default" : $"{resource}/.default" };

     try{
          result = _app.AcquireTokenForClient(scopes).ExecuteAsync().Result;
     }
     catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
     {
          // Invalid scope. The scope has to be of the form "https://resourceurl/.default"
          // Mitigation: change the scope to be as expected
          Console.WriteLine("Scope provided is not supported");
          return null;
     }
            return result.AccessToken;
}

Tenant-GUID是租户的唯一租户 GUID Azure AD租户。 应用程序 ID是在门户上的应用程序注册Azure AD ID。