Я работаю над веб-приложением, использующим OpenIdConnectAuthentication с использованием файлов cookie.Приложение основано на WebAPI, но использует OWIN для проверки подлинности, так как оно первоначально использовало проверку подлинности с помощью форм, и мы пытаемся подключить замену с помощью IdentityServer 4. Когда пользователь впервые обращается к приложению, процесс проверки подлинности происходит, как ожидается, и файл cookie проверки подлинности устанавливаетсякак и ожидалось.Если cookie затем удаляется вручную, процесс аутентификации не происходит при обновлении страницы, и в результате мы получаем ошибку (из-за зависимости от идентификатора в конструкции контроллера).Глядя на вывод трассировки, промежуточное программное обеспечение OWIN определенно вызывается в правильном месте в конвейере, поэтому, почему аутентификация cookie не происходит, я не могу.
Отладка промежуточного программного обеспечения, я вижу, что Identity неустановить после того, как промежуточное программное обеспечение OpenIdConnectAuthentication выполнится, поэтому, если не произойдет какое-то странное кэширование, я бы ожидал, что будет запущен процесс аутентификации.
После небольшой задержки обновите страницу во второй раз и она сновааутентифицируется.
Есть идеи?
Вот фрагмент Startup.cs для клиента:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "cookies",
AuthenticationMode = AuthenticationMode.Active,
SlidingExpiration = false,
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.Never
});
//Implicit Flow
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = identityServerUrl,
AuthenticationMode = AuthenticationMode.Active,
ClientId = appName,
ResponseType = "id_token token",
RedirectUri = returnUrl, // This application
Scope = "openid profile username", // Basic claims plus the custom 'username' claim
UseTokenLifetime = false, // Otherwise cookie lifetime is too short lived
TokenValidationParameters = new TokenValidationParameters()
{
NameClaimType = "username"
},
SignInAsAuthenticationType =
"cookies", //Same as AuthenticationType for provider above (in this case cookies)
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async ctx =>
{
var userInfoClient = new UserInfoClient($"{identityServerUrl}/connect/userinfo");
var response = await userInfoClient.GetAsync(ctx.ProtocolMessage.AccessToken);
ctx.AuthenticationTicket.Identity.AddClaims(response.Claims);
ctx.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", ctx.ProtocolMessage.AccessToken));
}
}
});
app.UseStageMarker(PipelineStage.Authenticate);