2016-06-27 1 views
2

Я использую openiddict и ASP Identity, и я пытаюсь добавить «GroupId» в качестве требования к токену аутентификации, который возвращается при входе в систему (с использованием конечной точки/connect/token - см. пример, который я привел ниже). GroupId является свойством в моем классе AplicationUser.ASP Core Добавить пользовательскую претензию к Auth Token

Я попытался использовать IClaimsTransformer, но это кажется неуклюжим, я не могу легко добраться до UserManager из ClaimsTransformationContext.

Как я могу получить UserManager через DI в моем IClaimsTransformer или просто добавить GroupId к токену, который сгенерирован в конечной точке соединения/маркера?

Я следовал за this примером для настройки моего сайта. Это то, что я хотел бы сделать:

var groupGuid = User.Claims.FirstOrDefault(c => c.Type == "GroupGuid"); 

ответ

0

ASP Ядро Добавить настраиваемую Претензию к Auth Токену

Вы не можете изменить маркер после его подписания IdP, так что вы можете» t добавить заявку на токен.

Я попытался с помощью IClaimsTransformer, но это, кажется неуклюжим, я не может легко добраться до UserManager от ClaimsTransformationContext.

Я думаю, ваша проблема связана с этим github issue. В целом (насколько я понимаю), если класс ClaimsTransformer зарегистрирован как синглет, и одна из его зависимостей ограничена или преходяща, она вызывает captive dependency. В этом случае вы должны использовать шаблон «Локатор сервиса», чтобы избежать зависимости от неактивного. Ваш код может быть что-то вроде этого (от комментария @PinpointTownes'):

public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
{ 
    var userManager= context.Context.RequestServices.GetRequiredService<UserManager>(); 
    // 
} 

- Мои мысли о вашем случае -

У вас есть два основных варианта для достижения своей цели:

Добавить требование лексем, когда маркер генерируется IdP:

Вам не нужен этот метод в большинстве случаев, но если вы хотите использовать его:

  • Вы должны иметь контроль над IdP, потому что этот вариант возможен на IdP (насколько я понимаю, ваш IdP и ресурсов сервера такой же, так что у вас есть контроль над IdP, но это может быть невозможно всегда).
  • Вы должны позаботиться о несогласованности при использовании этой опции, поскольку требование хранится в токене и не получает каждый запрос. Таким образом, реальное значение претензии может отличаться от требования в токене (я не предпочитаю его для ролей, разрешений, групп и т. Д., Потому что эти претензии могут быть изменены в любое время).

p.s: Я не знаю, можно ли добавлять претензии к токену с Openiddict.Трансформация

Иски

На самом деле я использовал HttpContext.Items для хранения дополнительных требований, прежде чем я открыл этот метод, и он работал хорошо для меня. Но я думаю, что лучший способ - использовать Claims Transformation, и он вписывается в ваш случай.

3

Существует несколько способов ее достижения:
Во-первых, перекрывающих CreateUserPrincipalAsync метод в пользовательских SignInManager:

public override async Task<ClaimsPrincipal> CreateUserPrincipalAsync(ApplicationAdmin user) 
{ 
    var principal = await base.CreateUserPrincipalAsync(user); 
    // use this.UserManager if needed 
    var identity = (ClaimsIdentity)principal.Identity; 
    identity.AddClaim(new Claim("MyClaimType", "MyClaimValue"));    

    return principal; 
} 

Второй способ, чтобы переопределить CreateAsync метод пользовательских UserClaimsPrincipalFactory:

public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user) 
{ 
    var principal = await base.CreateAsync(user); 

    var identity = (ClaimsIdentity)principal.Identity; 
    identity.AddClaim(new Claim("MyClaimType", "MyClaimValue")); 

    return principal; 
} 

который есть, в основном, тот же, потому что base.CreateUserPrincipalAsync способ в SignInManager звонки this.UserClaimsPrincipalFactory() внутри.

Не забудьте добавить свои собственные реализации в сфере услуг:
либо

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddSignInManager<CustomSignInManager>(); 
} 

или

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomClaimsPrincipalFactory>(); 
} 
Смежные вопросы