J'utilise IdenetityServer4 et redirige vers le client MVC après que la déconnexion ne fonctionne pas. Voici mon action de déconnexion du contrôleur client MVC:
public async Task Logout()
{
await HttpContext.Authentication.SignOutAsync("Cookies");
await HttpContext.Authentication.SignOutAsync("oidc");
}
Voici le fichier de configuration de l'hôte du serveur d'identité 4.
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
// other clients omitted...
// OpenID Connect implicit flow client (MVC)
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.Implicit,
// where to redirect to after login
RedirectUris = { "http://localhost:58422/signin-oidc" },
// where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:58422/signout-callback-oidc" },
AllowedScopes = new List<string>
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile
}
}
};
}
Je veux que l'utilisateur soit redirigé vers le client MVC après s'être déconnecté d'IdentityServer. Pour le moment, l'utilisateur doit cliquer sur le lien afficher dans l'image ci-dessous pour être redirigé vers le site MVC, mais je pense que l'utilisateur devrait être automatiquement redirigé vers le client MVC.
Il n'y a aucun problème dans votre Config.cs ou dans le contrôleur MVC.
Accédez à votre application IdentityServer4 puis dans la méthode de déconnexion [HttpPost] de AccountController, effectuez les modifications suivantes:
public async Task<IActionResult> Logout(LogoutViewModel model)
{
...
//return View("LoggedOut", vm);
return Redirect(vm.PostLogoutRedirectUri);
}
Cela redirigera l'utilisateur vers l'application MVC (dans votre cas).
Il existe une meilleure façon de procéder: vous pouvez définir ces options à partir de AccountOptions.cs comme suit:
public static bool ShowLogoutPrompt = false;
public static bool AutomaticRedirectAfterSignOut = true;
Si quelqu'un utilise l'échafaudage (il utilise les fichiers Razor Page), voici comment le réparer selon la réponse d'Akhilesh:
Dans Areas\Identity\Pages\Account\Logout.cshtml:
Tout d'abord, ajoutez le service IIdentityServerInteractionService
:
IIdentityServerInteractionService _interaction;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger, IIdentityServerInteractionService _interaction)
{
_signInManager = signInManager;
_logger = logger;
this._interaction = _interaction;
}
Vous devrez peut-être ajouter la prise en charge de OnGet()
, la logique peut être différente selon votre cas, dans mon cas, Get ou Post n'a pas d'importance:
public async Task<IActionResult> OnGet(string returnUrl = null)
{
return await this.OnPost(returnUrl);
}
Ajoutez la logique LogoutId dans OnPost:
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
var logoutId = this.Request.Query["logoutId"].ToString();
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else if (!string.IsNullOrEmpty(logoutId))
{
var logoutContext = await this._interaction.GetLogoutContextAsync(logoutId);
returnUrl = logoutContext.PostLogoutRedirectUri;
if (!string.IsNullOrEmpty(returnUrl))
{
return this.Redirect(returnUrl);
}
else
{
return Page();
}
}
else
{
return Page();
}
}