Сопоставить заявки с пользовательскими свойствами ApplicationUser - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь понять, как добавить пользовательский класс ApplicationUser в мое приложение ASP.NET Core MVC, которое выполняет аутентификацию во внешней системе (другой проект MVC, использующий IdentityServer 4).Я настроил IProfileService в приложении IdentityServer 4 для добавления настраиваемой заявки в профиль пользователя, например, «avatarUrl», с URL-адресом в качестве значения заявки.Теперь в моем клиентском приложении я создал пользовательский ApplicationUser:

public class ApplicationUser : IdentityUser
{
    public string AvatarUrl { get; set; }
}

Как настроить платформу удостоверений ASP.NET, чтобы после входа в систему внешнего IdSrv пользователь в HttpContext имел это свойствовыставлено (не через иск)?Я хочу иметь возможность сделать это в методе контроллера:

this.HttpContext.User.Identity.AvatarUrl

Нужно ли создавать класс, производный от ClaimsPrincipal?И какой метод, для какого класса мне нужно переопределить, чтобы назначить свой CustomClaimsPrincipal для HttpContext?

РЕДАКТИРОВАТЬ: я пытался внедрить пользовательский AppSignInManager, но я заметил, что он не используется.Похоже, что поскольку приложение вызывает IdentityServer для аутентификации, с OpenIdConnect, SignInManager не участвует в процессе.В ConfigureServices у меня есть стандартный код для аутентификации с внешним сервером идентификации:

services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddOpenIdConnect("oidc", options =>
    {
        #region Oidc events
        options.Events.OnUserInformationReceived = context =>
        {
            // For debugging
            return Task.CompletedTask;
        };
        #endregion

        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = Configuration.GetSection("IdentityServer:Authority").Value;
        options.RequireHttpsMetadata = false;

        options.ClientId = "myapp";
        options.SaveTokens = true;
        // TODO: provide a real client secret
        options.ClientSecret = "secret";
        options.ResponseType = "code id_token";
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
        foreach (var scope in "openid profile email".Split(' ', StringSplitOptions.RemoveEmptyEntries))
        {
            options.Scope.Add(scope);
        }

        options.ClaimActions.Remove("name");
        options.ClaimActions.Remove("email");
        options.ClaimActions.MapUniqueJsonKey(ClaimTypes.Name, "name");
        options.ClaimActions.MapUniqueJsonKey(ClaimTypes.Email, "email");
        options.ClaimActions.MapUniqueJsonKey("avatarUrl", "avatarUrl");
    });

Так что теперь мне интересно ... так как SignInManager не вызывается, где находится код, который создает объект ClaimsPrincipalпосле аутентификации с Oidc?Какой метод мне нужно переопределить?

...