在 Service Fabric AD 应用程序上分配服务主体管理员角色

Assign service principal Admin Role on Service Fabric AD App

我正在为我的 Service Fabric 集群设置 Azure AD 应用程序,因此我不需要依赖 Cert Auth 来连接到集群。

我们使用来自 App Registration 的服务主体,该服务主体具有订阅 运行 ARM 模板的 Contributor 访问权限来设置集群。有没有办法让服务主体也成为集群 AD 应用程序的管理员?

我们的部署脚本在 Powershell 中,看到了这个 post: 关于如何自动连接,但我需要一种连接服务主体的方法。

我相信您可以通过将此 C# 代码转换为 Powershell 来实现,例如使用 New-Object 创建下面提到的对象。 确保用您自己的 AppRegistation 详细信息、服务器证书的指纹和集群替换 guids url.

string tenantId = "C15CFCEA-02C1-40DC-8466-FBD0EE0B05D2";
string clientApplicationId = "118473C2-7619-46E3-A8E4-6DA8D5F56E12";
string webApplicationId = "53E6948C-0897-4DA6-B26A-EE2A38A690B4";

string token = GetAccessToken(
    tenantId,
    webApplicationId,
    clientApplicationId,
    "urn:ietf:wg:oauth:2.0:oob");

string serverCertThumb = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
string connection = "clustername.westus.cloudapp.azure.com:19000";

var claimsCredentials = new ClaimsCredentials();
claimsCredentials.ServerThumbprints.Add(serverCertThumb);
claimsCredentials.LocalClaims = token;

var fc = new FabricClient(claimsCredentials, connection);

try
{
    var ret = fc.ClusterManager.GetClusterManifestAsync().Result;
    Console.WriteLine(ret.ToString());
}
catch (Exception e)
{
    Console.WriteLine("Connect failed: {0}", e.Message);
}

...

static string GetAccessToken(
    string tenantId,
    string resource,
    string clientId,
    string redirectUri)
{
    string authorityFormat = @"https://login.microsoftonline.com/{0}";
    string authority = string.Format(CultureInfo.InvariantCulture, authorityFormat, tenantId);
    var authContext = new AuthenticationContext(authority);

    var authResult = authContext.AcquireToken(
        resource,
        clientId,
        new UserCredential("TestAdmin@clustenametenant.onmicrosoft.com", "TestPassword"));
    return authResult.AccessToken;
}

他们使用隐式流(需要在您的 AppRegistration 中启用)从 Azure AD 获取访问令牌。他们在 ClaimsCredential 中使用它传递给 FabricClient。 更多信息 here.

我想出了如何让它工作。

第一部分是在客户端应用程序上为服务主体赋予角色。

  1. 转到 Azure 门户 -> Azure Active Directory -> 应用程序注册并select 创建客户端应用程序。
  2. 转到 Manifest 页面并找到 Admin 应用程序角色并将 "Application" 的条目添加到 allowedMemberTypes 属性。更新时保存。
  3. 转到应用程序注册和select您正在使用的应用程序 运行 自动化
  4. 转到 API 权限,单击添加权限按钮。转到 APIs my organization uses 选项卡并搜索 SF 集群客户端应用程序。
  5. Select 应用程序权限并选择了 Admin 权限。
  6. 点击Grant admin consent for <Tenant Name>

授予权限后,您可以运行 PowerShell 脚本:

Add-Type -Path "./Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
$authority = "https://login.microsoftonline.com/$($tenantId)"
$credentials = [Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]::new($AzureLogin, $AzurePassword)
$authContext = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]::new($authority)

$authResult = $authContext.AcquireTokenAsync($clientAppId, $credentials) 
$Token = $authResult.Result.AccessToken
Connect-ServiceFabricCluster -AzureActiveDirectory -SecurityToken $Token `
        -ConnectionEndpoint $endpoint -ServerCertThumbprint $thumbprint