Я следую шаблону быстрого запуска Identity Server и пытаюсь настроить следующий
- Identity Server в качестве pnet основного приложения
- Mvc клиента, который аутентифицируется в is4 а также вызывает клиента webapi, который является защищенным ресурсом API.
В ApplicationUser
есть дополнительный столбец, который я добавляю в заявки из ProfileService
, например:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
if (user == null)
return;
var principal = await _claimsFactory.CreateAsync(user);
if (principal == null)
return;
var claims = principal.Claims.ToList();
claims.Add(new Claim(type: "clientidentifier", user.ClientId ?? string.Empty));
// ... add roles and so on
context.IssuedClaims = claims;
}
И, наконец, вот конфигурация в методе Mvc Клиентское приложение ConfigureServices
:
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.ClientSecret = "mvc-secret";
options.ResponseType = "code";
options.SaveTokens = true;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("offline_access");
options.Scope.Add("api1");
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapUniqueJsonKey("clientidentifier", "clientidentifier");
});
Если для GetClaimsFromUserInfoEndpoint
установлено значение true
, я могу получить доступ к пользовательской заявке в User.Identity
, но это приводит к 2 вызывает ProfileService
.
Если я удаляю или задаю значение false, то это утверждение все еще является частью access_token, но не частью id_token, и тогда я не могу получить доступ к этому заданному утверждению c из контекста User .
Есть ли лучший способ, которым я могу получить доступ к этой заявке от Принципала пользователя, не приводя к 2 вызовам (как сейчас)? или, возможно, чтение access_token из контекста и обновление утверждений пользователя после получения токена?
спасибо :)