Skip to content

Issues to use user managed identity on AzureChinaCloud #22

Description

@Jezour

I'm sorry for the silly question.
I'm not able to use the ConfigureForAzureWithUserAssignedManagedIdentityAsync in AzureChinaCloud cloud.
(I'm referring to az cloud list --output table)
To test the connection via user-defined managed identity I'm using just an easy console c# app like this, and it works on AzurePublic quite ok. Unfortunately, it doesn't work in the AzureChinaCloud or I simply don't know how to use it.

using Microsoft.Azure.StackExchangeRedis;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestRedisManagedIdentityConnect2
{
    internal class Program
    {
        
        static void Main(string[] args)
        {


            if (args.Length == 1)
            {
                string connectionString = args[0];
                Console.WriteLine("Connection: [" + connectionString + "]");

                var configurationOptions = ConfigurationOptions.Parse(connectionString);
                Console.WriteLine("configurationOptions:");
                Console.WriteLine("[" + configurationOptions.ToString() + "]");
                //ConnectMe(configurationOptions);
                ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(configurationOptions);
                for (int i = 0; i <= 9; i++)
                {
                    Console.WriteLine("(" + i + ") Status: [" + redis.GetStatus() + "]");
                    Console.WriteLine("(" + i + ") Counters: [" + redis.GetCounters() + "]");
                    Console.WriteLine("(" + i + ") redis.IsConnected: [" + redis.IsConnected + "]");
                    Console.WriteLine("(" + i + ") redis.database: [" + redis.GetDatabase() + "]");
                    System.Threading.Thread.Sleep(1000);
                }

            }
            else if (args.Length == 2)
            {
                string connectionString = args[0];
                string systemAssignedManagedIdentityPrincipalId = args[1];

                Console.WriteLine("Connection: [" + connectionString + "]");
                Console.WriteLine("SystemAssignedManagedIdentity PrincipalId: [" + systemAssignedManagedIdentityPrincipalId + "]");

                var configurationOptions = ConfigurationOptions.Parse(connectionString);
                configurationOptions.ConfigureForAzureWithSystemAssignedManagedIdentityAsync(systemAssignedManagedIdentityPrincipalId).GetAwaiter();

                ConnectionMultiplexer redis = ConnectionMultiplexer.ConnectAsync(configurationOptions).GetAwaiter().GetResult();

                for (int i = 0; i <= 9; i++)
                {
                    Console.WriteLine("(" + i + ") Status: [" + redis.GetStatus() + "]");
                    Console.WriteLine("(" + i + ") Counters: [" + redis.GetCounters() + "]");
                    Console.WriteLine("(" + i + ") redis.IsConnected: [" + redis.IsConnected + "]");
                    Console.WriteLine("(" + i + ") redis.database: [" + redis.GetDatabase() + "]");
                    System.Threading.Thread.Sleep(1000);
                }
            }
            else if (args.Length == 3)
            {
                string connectionString = args[0];
                string userManagedIdentityClientId = args[1]; 
                string userManagedIdentityObjectId = args[2];
                Console.WriteLine("Connection: [" + connectionString + "]");
                Console.WriteLine("UserManagedIdentity ClientId: [" + userManagedIdentityClientId + "]");
                Console.WriteLine("UserManagedIdentity ObjectId: [" + userManagedIdentityObjectId + "]");

                var configurationOptions = ConfigurationOptions.Parse(connectionString);

                configurationOptions.ConfigureForAzureWithUserAssignedManagedIdentityAsync(userManagedIdentityClientId, userManagedIdentityObjectId).GetAwaiter();

                ConnectionMultiplexer redis = ConnectionMultiplexer.ConnectAsync(configurationOptions).GetAwaiter().GetResult();
                
                for (int i = 0; i <= 9; i++)
                {
                    Console.WriteLine("(" + i + ") Status: [" + redis.GetStatus() + "]");
                    Console.WriteLine("(" + i + ") Counters: [" + redis.GetCounters() + "]");
                    Console.WriteLine("(" + i + ") redis.IsConnected: [" + redis.IsConnected + "]");
                    Console.WriteLine("(" + i + ") redis.database: [" + redis.GetDatabase() + "]");
                    System.Threading.Thread.Sleep(1000);
                }


            }
            else
            {
                Console.WriteLine("Wrong number of args.");
                Console.WriteLine("You can use 1 argument with the connection string");
                Console.WriteLine("or 3 arguments where the 1st is connectionstring 2nd is userManagedIdentityClientId 3rd is userManagedIdentityObjectId.");
            }


        }


    }


}

test with Accesskey (1 arg)

 .\mytest.exe "xxx.cache.chinacloudapi.cn:6380,password=xxx4TDihpAzCaOVkTDQ=,ssl=True,abortConnect=False"

Connection: [onluatcn.redis.cache.chinacloudapi.cn:6380,password=xxxlI5sv1luTPaLK2xfTqNMm8eM4TDihpAzCaOVkTDQ=,ssl=True,abortConnect=False]
it's working quite fine. (redis.IsConnected: [True])

test with System Access Token (2 arg)

 .\mytest.exe "xxx.cache.chinacloudapi.cn:6380,ssl=True,abortConnect=False" 'xxxxc3e5-c42a-49af-894b-076b7790fe06'

It's NOT working. (redis.IsConnected: [False])

test with User managed Access Token (3 arg)

 .\mytest.exe "xxx.cache.chinacloudapi.cn:6380,ssl=True,abortConnect=False"  "xxxxa00c-4cca-491c-b892-7836004aa873" "xxxx8274-2d45-457c-94f2-bf102d5d7bd1"

It's NOT working. (redis.IsConnected: [False])

I would expect some switch based on the suffix like '.cache.chinacloudapi.cn' and '.cache.chinacloudapi.cn' but in be hidden also somewhere inside the Microsoft.Identity library.

The question is how should I use the Microsoft.Azure.StackExchangeRedis in AzureChinaCloud with user-defined managed identity.
Is there any example where can I find more details?
Or can you please put it as an example in the documentation?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions