#.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/…