Я пытаюсь понять, как добавить пользовательский класс 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?Какой метод мне нужно переопределить?