При использовании аутентификации Core Identity OAuth2 (и получения информации о пользователе) в последних примерах MS используется такой код:
options.Events = new OAuthEvents
{
// ...
OnCreatingTicket = async (OAuthCreatingTicketContext context) =>
{
var userInfo = // ..
context.RunClaimActions(userInfo);
}
}
MS называют это «Действие претензий».
Но как получить доступ к этим утверждениям действий позже, в коде контроллера?
Чтобы быть конкретным, как получить доступ к ним в «Core Identity 2.1» сгенерированных Razor страницах пользователя внешний логин OnGetCallbackAsync
// ExternalLogin.cshtml.cs
public async Task<IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
{
var claimsIdentity = User.Identity as ClaimsIdentity;
var claimsPrincipal = User.Identity as ClaimsPrincipal; // null
// claimsIdentity doesn't contains oauth target claims (since this new not registered yet user?)
// ..
var signInResult = await _signInManager.ExternalLoginSignInAsync(...);
if (signInResult.Succeeded)
{
}else // means yet not registered locally
{
// HOW TO ACCESS ACTION CLAIMS THERE?
// or how to get authentication token to get user info manually...
}
}
приписка
В дополнение к ответу: RunClaimActions
следует использовать вместе с MapJsonKey
serviceCollection.AddAuthentication().AddOAuth(options =>
{
// ...
// https://msdn.microsoft.com/en-us/library/microsoft.identitymodel.claims.claimtypes_members.aspx
options.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
options.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
options.ClaimActions.MapJsonKey("SalesforceOrganizationId", "organization_id");
Тогда к полям userinfo можно обращаться как к обычным заявкам пользователей. Следовательно, «претензии к действию» - это не «претензии особого типа», а просто «еще одна магия ASP MVC».
Также не забудьте о options.SaveTokens = true;
Только с его помощью вы сможете получить токен как
var info = await _signInManager.GetExternalLoginInfoAsync();
var token = info.AuthenticationTokens ()[0];
и получите дополнительную информацию от других подключенных служб.