web-dev-qa-db-fra.com

IdentityServer4 - Rediriger vers le client MVC après la déconnexion

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.

enter image description here

11
Sandeep

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;
26
heyAkhilesh

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();
        }
    }
5
Luke Vo