У меня возникли проблемы с попыткой выяснить, как заставить работать URL-адрес выхода из системы в моем ASP. NET Core MVC приложении. Я следил за примерами из документации Identity Server и других сообщений, хотя не совсем уверен, где я ошибаюсь. Пользователь успешно вышел из приложения, затем перенаправлен на Identity Server и вышел оттуда, но я заметил, что параметр id_token не передается на Identity Server, поэтому даже несмотря на то, что параметр post logout присутствует, он не используется.
Моя конфигурация промежуточного программного обеспечения выглядит правильно, я считаю, что это проблема с тем, как я создаю приложение cook ie, и токен на самом деле не сохраняется в любом месте, где его можно было бы повторно использовать.
В настоящее время я использую только тип ответа «код», но, похоже, он также включает токен идентификации вместе с токеном авторизации.
Startup.cs:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "oidc";
})
.AddJwtBearer("Bearer", options =>
{
options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
options.RequireHttpsMetadata = false;
options.Audience = Configuration["IdentityServerSettings:Audience"];
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect("oidc", options =>
{
options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
options.ClientId = "myClient";
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.SignedOutRedirectUri = "http://localhost:55690/account/logoutcallback";
options.SignedOutCallbackPath = "/account/logoutcallback";
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});
AccountController.cs
Способы выхода:
public async Task<IActionResult> Logout()
{
return new SignOutResult(new[] { CookieAuthenticationDefaults.AuthenticationScheme, "oidc" });
}
public async Task<IActionResult> LogoutCallback()
{
return RedirectToAction(nameof(Dashboard), "Account");
}
Обратный вызов при входе:
if (!Request.Query.ContainsKey("code"))
throw new Exception($"Request query string does not contain an authorization code. Query string: {Request.QueryString.Value}");
var authCode = Request.Query["code"].ToString();
TokenResponse tokenResponse = null;
using (var httpClient = new HttpClient())
{
tokenResponse = await httpClient.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
{
Address = _configuration["IdentityServerDashboardSettings:TokenUrl"],
ClientId = _configuration["IdentityServerDashboardSettings:ClientId"],
RedirectUri = _configuration["IdentityServerDashboardSettings:RedirectUrl"],
Code = authCode
});
}
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadToken(tokenResponse.AccessToken) as JwtSecurityToken;
var identity = new ClaimsIdentity(jwtToken.Claims, CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim("id_token", tokenResponse.IdentityToken));
var claimsPrinciple = new ClaimsPrincipal();
claimsPrinciple.AddIdentity(identity);
await HttpContext.SignInAsync(claimsPrinciple);
return RedirectToAction(nameof(Dashboard), "Account");
Все остальное работает нормально, SignOutResult успешно создает URL-адрес выхода и перенаправляет на сервер идентификации, но в параметрах отсутствует id_token. Я действительно не могу найти никаких примеров того, как я должен хранить это для дальнейшего использования, многие примеры, с которыми я столкнулся, похоже, просто работают автоматически. Я что-то настроил неправильно?