Я использую IdentityServer4 для федерации аутентификации для моих пользователей через AD и внешнего поставщика OAuth2.0.
В настоящее время я изменяю Быстрый запуск внешних поставщиков. Все внешние поставщики перенаправляются на один метод обратного вызова, в котором предполагается, что для SignInScheme задано значение «IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme».
Поэтому я настроил своих внешних поставщиков для использования этой схемы.
/ startup.cs
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options =>
{
options.ClientId = Configuration["Authentication:Microsoft:ClientId"];
options.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
options.TenantId = "...";
options.CallbackPath = "/signin-oidc";
options.Instance = "https://login.microsoftonline.com/";
options.CookieSchemeName = IdentityServerConstants.ExternalCookieAuthenticationScheme;
})
.AddCookie()
.AddOAuth("myprovider", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "client_id";
options.ClientSecret = "client_secret";
options.CallbackPath = "/authorization-code/callback";
options.AuthorizationEndpoint = "http://localhost:3000/oauth2/authorize";
options.TokenEndpoint = "http://localhost:3000/oauth2/token";
options.Scope.Add("userinfo");
});
Для AzureAD это работает нормально, и заявки, возвращенные из токена, сопоставляются. Однако для поставщика OAuth в методе Callback претензии не возвращаются.
/ ExternalController.cs
public async Task<IActionResult> Callback()
{
// read external identity from the temporary cookie
var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
throw new Exception("External authentication error");
}
if (_logger.IsEnabled(LogLevel.Debug))
{
var externalClaims = result.Principal.Claims.Select(c => $"{c.Type}: {c.Value}");
_logger.LogDebug("External claims: {@claims}", externalClaims);
}
Моему поставщику OAuth2.0 возвращается токен JWT Bearer из конечной точки токена , Если я добавлю пользовательское событие OnCreatingTicket, то я увижу, что токен доступа к контексту - это правильный токен, который я могу декодировать в JWT.io, однако утверждения не заполняются на Принципале.
options.Events.OnCreatingTicket = ctx =>
{
// externalClaims is empty
var externalClaims = ctx.Principal.Claims.Select(c => $"{c.Type}: {c.Value}");
// AccessToken is the encoded JWT.
String token = ctx.AccessToken;
return Task.CompletedTask;
};
Как я могу получить претензии от JWT, добавленные к Принципалу?
Спасибо!