Я использую Identity Server 4 и UserProfileService для предоставления пользовательских требований для пользователя.
Существует два сценария ios для покрытия:
- Mvc приложение должно получить доступ к UserClaims через промежуточное ПО
- Другое приложение не. Net должно получить доступ к UserClaims (например, Postman или React)
Я пробовал два способа, но все еще не смог выполнить оба вышеуказанных требования:
Метод 1 : Использование IdentityServerConstants.ClaimValueTypes.Json
В UserProfileService.cs я добавил следующие утверждения:
var roles= new List<string>
{
"products.read", "products.write", "products.delete"
};
claims.Add(new Claim("roles", JsonConvert.SerializeObject(roles), IdentityServerConstants.ClaimValueTypes.Json));
Я сгенерировал AccessToken и отправил запрос в UserInfoEndpoint. Я успешно получил следующий результат:
{
"user_id": "950d44f1-d19e-412b-9fad-e0b59c11b2ec",
...
"roles": [
"products.read",
"products.write",
"products.delete"
],
"sub": "950d44f1-d19e-412b-9fad-e0b59c11b2ec"
}
Затем я добавил это в Mvc application \ Startup.cs
options.ClaimActions.MapUniqueJsonKey("roles", "roles", "json");
Однако в моем приложении Mvc я получил ошибку и не смог десериализовать массив ролей в заявке.
InvalidCastException: Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken.
Newtonsoft.Json.Linq.Extensions.Convert<T, U>(T token)
Метод 2 : без использования IdentityServerConstants.ClaimValueTypes.Json
Если я удалил IdentityServerConstants. ClaimValueTypes. Json) при добавлении типов заявок работает в приложении MVC. Но он отображается как строка в почтальоне вместо объекта Json. Смотри ниже:
{
"user_id": "950d44f1-d19e-412b-9fad-e0b59c11b2ec",
"permissions": "[\"products.read\",\"products.write\",\"products.delete\"]",
"sub": "950d44f1-d19e-412b-9fad-e0b59c11b2ec"
}
Мне просто интересно, это умышленно или я что-то не так сделал?
Есть ли способ сохранить заявки в формате Json и заставить Mvc сопоставлять заявки для массива строк в заявке?