在Service Fabric AD App上分配服务主体管理员角色

时间:2020-05-15 21:22:37

标签: azure-service-fabric

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

我们使用来自应用程序注册的服务主体,该主体具有对订阅的“提供者”访问权限,可以运行ARM模板来设置集群。有没有办法让我也可以使服务主体成为群集AD应用程序上的管理员?

我们的部署脚本位于Powershell中,并看到了这篇文章:Deploying ServiceFabric apps using AzureAD Authentication关于如何自动连接,但是我需要一种与服务主体连接的方法。

2 个答案:

答案 0 :(得分:0)

我相信您可以通过将C#代码转换为Powershell来实现,例如通过使用New-Object创建下面提到的对象。 确保用您自己的AppRegistation详细信息,服务器证书的指纹以及群集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 :(得分:0)

我弄清楚了如何使其工作。

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

  1. 转到Azure门户-> Azure Active Directory->应用程序注册,然后选择创建的客户端应用程序。
  2. 转到Manifest页面并找到Admin应用角色,并将"Application"的条目添加到allowedMemberTypes属性中。更新后保存。
  3. 转到“应用程序注册”,然后选择要用于运行自动化的应用程序
  4. 转到“ API权限”,单击“添加权限”按钮。转到APIs my organization uses标签,然后搜索SF Cluster Client Application。
  5. 选择“应用程序权限”,然后选择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