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

Posted

技术标签:

【中文标题】在 Service Fabric AD 应用程序上分配服务主体管理员角色【英文标题】:Assign service principal Admin Role on Service Fabric AD App 【发布时间】:2020-09-01 19:56:16 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我相信您可以通过将此 C# 代码翻译成 Powershell 来做到这一点,例如使用 New-Object 创建下面提到的对象。 确保将 guid 替换为您自己的 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。

【讨论】:

【参考方案2】:

我想出了如何让它工作。

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

    转到 Azure 门户 -> Azure Active Directory -> 应用注册并选择创建的客户端应用。 转到Manifest 页面并找到Admin 应用角色并将"Application" 的条目添加到allowedMemberTypes 属性。更新时保存。 转到应用注册并选择您用于运行自动化的应用 转到 API 权限,单击添加权限按钮。转到 APIs my organization uses 选项卡并搜索 SF Cluster Client Application。 选择应用程序权限并选择Admin 权限。 点击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

【讨论】:

以上是关于在 Service Fabric AD 应用程序上分配服务主体管理员角色的主要内容,如果未能解决你的问题,请参考以下文章

单个节点上的 Service Fabric 无状态服务部署

未为部署在 Service Fabric Linux 集群上的 .Net 核心应用生成应用洞察

在 Linux 上创建第一个 Service Fabric Java 应用程序

如何让 Service Fabric 反向代理在 Azure 上工作

新证书上的 Service Fabric 应用 Kestrel 证书轮换

Service Fabric 多个 SSL 安全 WebAPI 和证书翻转