Как получить список всех пользователей из keycloak с помощью ядра Dotnet

#.net-core #keycloak

Вопрос:

Мы создали одно приложение POC для наших местных целей. Приложение создано в шаблоне .NET Core MVC. Мне нужно получить список всех пользователей на keycloak основе имени области, но я не знаю, как получить список всех пользователей из ключа. Пожалуйста, помогите мне.

 "keycloak": {
    "Authority": "http://localhost:8080/auth/realms/KeycloakMVCDemo",
    "ClientId": "mvcdemo",
    "ClientSecret": "c035ee7c-2e10-43b0-a63c-c9137580b630"
  }
 

Ответ №1:

Во-первых: вы не должны показывать свой секрет здесь публично 🙂

Попробуй это:

Сначала вам нужно получить токен:

 var client =
                new RestClient(
                    "https://yourkeycloak.de/auth/realms/yourrealm/protocol/openid-connect/token");
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddParameter("client_id", "XXXXX");
            request.AddParameter("client_secret", "XXXX");
            request.AddParameter("grant_type", "client_credentials");
            IRestResponse response = client.Execute(request);
          
            var token = JsonConvert.DeserializeObject<OAuthResponse>(response.Content).access_token;
 

Чем вы можете использовать api для получения всех пользователей из области

 var client = new RestClient("https://yourkeycloak.de/auth/admin/realms/yourrealname/users");
            var request = new RestRequest(Method.GET);
            request.AddHeader("Authorization", "Bearer "   _token);
            request.AddHeader("Content-Type", "application/json");
            IRestResponse response = client.Execute(request);
 

Чтобы получить пользователей из ответа, вы можете десериализовать ответ следующим образом:

 var users = JsonConvert.DeserializeObject<UserRoot[]>(response.Content);
 

Вот классы, которые вам нужны для десериализации ответа:

  public class UserRoot
    {
        public User[] Property1 { get; set; }
    }

    public class User
    {
        public string id { get; set; }
        public long createdTimestamp { get; set; }
        public string username { get; set; }
        public bool enabled { get; set; }
        public bool totp { get; set; }
        public bool emailVerified { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public string email { get; set; }
        public object[] disableableCredentialTypes { get; set; }
        public object[] requiredActions { get; set; }
        public int notBefore { get; set; }
        public Access access { get; set; }
      
    }

    public class Access
    {
        public bool manageGroupMembership { get; set; }
        public bool view { get; set; }
        public bool mapRoles { get; set; }
        public bool impersonate { get; set; }
        public bool manage { get; set; }
    }
 

И структура для ответа OAuthResponse:

 public struct OAuthResponse
    {
        public string access_token;
        public int expires_in;
    }
 

Комментарии:

1. Спасибо, Оливер. Я попробовал вышеприведенный метод, но он не работает. токен возвращает нулевое значение.

2. Хорошо, я попробовал это с успехом незадолго до этого. вы уверены, что используете правильные данные конфигурации, такие как url-адрес, идентификатор клиента и секрет? и ввели ли вы свои данные о маскировке ключей в URL-адрес домена и области?

Ответ №2:

Оливер, я попробовал метод ниже, но var _token = gettoken(); метод возвращает null значение и IRestResponse response = client.Execute(request) возвращает ("StatusCode: Unauthorized, Content-Type: , Content-Length: 0)")

 using RestSharp;

 var _token = gettoken();
        var client = new RestClient("http://localhost:8080/auth/admin/realms/KeycloakMVCDemo/users");
        var request = new RestRequest(Method.GET);
        request.AddHeader("Authorization", "Bearer "   _token);
        request.AddHeader("Content-Type", "application/json");
        IRestResponse response = client.Execute(request);
        
   var client = new RestClient(
                "http://localhost:8080/auth/realms/KeycloakMVCDemo/protocol/openid-connect/token");
        client.Timeout = -1;
        var request = new RestRequest(Method.POST);
        request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
        request.AddParameter("client_id", "mvcdemo");
        request.AddParameter("client_secret", "********");
        request.AddParameter("grant_type", "client_credentials");
        IRestResponse response = client.Execute(request);

        var token = JsonConvert.DeserializeObject<OAuthResponse>(response.Content).access_token;
        return token;
 

Комментарии:

1. Хммм, хорошо. Я не знаю, как выглядит ваша конфигурация в keycloak, но вы можете попробовать почтальона, чтобы получить токен. Вот ссылка с другим учебником для jwt и keycloak, возможно, вы сможете проверить правильность ваших настроек. developers.redhat.com/blog/2020/01/29/…