2017-01-07 2 views
2

Я построил сервер идентификации с использованием IdentityServer4 с идентификатором ядра Asp.NET на Asp.NET Core. Я хочу сопоставить свойства моего ApplicationUser с запросами, отправленными, когда клиент обращается к UserInfoEndpoint.Реализация IUserClaimsPrincipalFactory вызывает StackOverflowException на IdentityServer4

Я пытался реализовать IUserClaimsPrincipalFactory следующим образом:

public class CustomUserClaimsPrincipalFactory : IUserClaimsPrincipalFactory<ApplicationUser> 
{ 

    public async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user) 
    { 
     var principal = await CreateAsync(user); 
     ((ClaimsIdentity)principal.Identity).AddClaims(new[] { 
     new Claim(ClaimTypes.GivenName, user.FirstName), 
     new Claim(ClaimTypes.Surname, user.LastName), 

     }); 
     return principal; 
    } 
} 

и зарегистрировать это нравится:

services.AddIdentity<ApplicationUser, IdentityRole>() 
       .AddEntityFrameworkStores<ApplicationDbContext>() 
       .AddDefaultTokenProviders() 
       .AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>(); 

, но я получаю StackOverflowException, когда клиент пытается получить доступ к UserInfoEndpoint.

Не могли бы вы помочь мне исправить это?

Примечание: Я проверил его, и у меня нет ошибок, если я не зарегистрирую фабрику ClaimsPrincipal.

+1

'var main = await CreateAsync (пользователь);' вы вызываете метод рекурсивно, пока стек не будет заполнен. Вы, вероятно, хотите назвать что-то другое здесь, какой-то usermanager или репозиторий? – Tseng

ответ

1

не эта линия рекурсивная функция вызывает себя рекурсивно в бесконечном цикле

var principal = await CreateAsync(user); 

CreateUser функция вы находитесь, и вы называете это снова рекурсивно, что создает бесконечный цикл, следовательно, переполнение стека

+2

Черт. Я буду форматировать свой компьютер, отказаться от кодирования и стать блоггером моды. – Hasan

Смежные вопросы