У нас есть клиентское приложение (веб-сайт), которое использует IdSvr3 в качестве сервера идентификации для аутентификации пользователей.Мы используем поток аутентификации OpenIdConnect, встроенный в OWIN.Проблема в том, что, скажем, через 30 минут бездействия я хочу выйти из системы и потребовать, чтобы он или она снова вошли в систему с использованием учетных данных.Хотя файл cookie для проверки подлинности на веб-сайте становится недействительным, но веб-сайт перенаправляется на IdSvr, повторно проходит проверку подлинности (без предоставления учетных данных) и позволяет пользователю просматривать защищенные страницы.Я не уверен, как выйти из IdSever без явного запроса на выход.
public void ConfigureAuth(IAppBuilder app)
{
string redirectUri = "http://mvcwebapp.local/";
string idServBaseUri = "https://idsvr3/core";
string tokenEndpoint = "https://idsvr3/core/connect/token";
string userInfoEndpoint = "https://idsvr3/core/connect/userinfo";
string clientId = "_Th4GVMa0JSrJ8RKcZrzbcexk5ca";
string clientSecret = "a3GVJJbLHkrn9nJRj3IGNvk5eGQa";
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = idServBaseUri,
RedirectUri = redirectUri,
ResponseType = "code id_token token",
Scope = "openid profile roles clef",
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
},
SignInAsAuthenticationType = "Cookies",
UseTokenLifetime = false,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async n =>
{
// use the code to get the access and refresh token
var tokenClient = new TokenClient(tokenEndpoint, clientId, clientSecret);
var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
if (tokenResponse.IsError)
{
throw new Exception(tokenResponse.Error);
}
// use the access token to retrieve claims from userinfo
var userInfoClient = new UserInfoClient(userInfoEndpoint);
var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);
// create new identity
var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType);
id.AddClaims(userInfoResponse.Claims);
id.AddClaim(new Claim(ClaimTypes.NameIdentifier, userInfoResponse.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value));
id.AddClaim(new Claim("access_token", tokenResponse.AccessToken));
id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString(CultureInfo.InvariantCulture)));
id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
id.AddClaim(new Claim("sid", n.AuthenticationTicket.Identity.FindFirst("sid").Value));
n.AuthenticationTicket = new AuthenticationTicket(
new ClaimsIdentity(id.Claims, n.AuthenticationTicket.Identity.AuthenticationType, "name", "role"),
n.AuthenticationTicket.Properties);
n.AuthenticationTicket.Properties.RedirectUri = n.RedirectUri;
n.AuthenticationTicket.Properties.ExpiresUtc = DateTime.UtcNow.AddSeconds(120);
},
RedirectToIdentityProvider = n =>
{
// if signing out, add the id_token_hint
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
{
var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");
if (idTokenHint != null)
{
n.ProtocolMessage.IdTokenHint = idTokenHint.Value;
}
}
return Task.FromResult(0);
},
}
});
}