我正在为我的Service Fabric群集设置Azure AD应用程序,因此不需要依靠Cert Auth来连接到群集。
我们使用来自应用程序注册的服务主体,该主体具有对订阅的贡献者访问权,可以运行ARM模板来设置集群。有没有一种方法可以使服务主体也成为群集AD应用程序上的管理员?
我们的部署脚本在Powershell中,并看到了这篇文章:Deploying ServiceFabric apps using AzureAD Authentication有关如何自动进行连接,但是我需要一种与服务主体进行连接的方法。
[我相信您可以通过将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("[email protected]", "TestPassword"));
return authResult.AccessToken;
}
他们使用隐式流(需要在您的AppRegistration中启用)从Azure AD获取访问令牌。他们在ClaimsCredential
中使用它传递到FabricClient
。更多信息here。