web-dev-qa-db-ja.com

IdentityServer4-ログアウト後にMVCクライアントにリダイレクトする

IdenetityServer4を使用していて、ログアウトが機能していない後にMVCクライアントにリダイレクトしています。以下は、MVCクライアントコントローラーのログアウトアクションです。

public async Task Logout()
{
    await HttpContext.Authentication.SignOutAsync("Cookies");
    await HttpContext.Authentication.SignOutAsync("oidc");
}

次に、IDサーバー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
            }
        }
    };
} 

IdentityServerからログアウトした後、ユーザーをMVCクライアントにリダイレクトさせたい。現在、ユーザーは下の画像に表示されているリンクをクリックしてMVCサイトにリダイレクトする必要がありますが、ユーザーはMVCクライアントに自動的にリダイレクトされるはずです。

enter image description here

11
Sandeep

Config.csまたはMVCコントローラーに問題はありません。

IdentityServer4アプリケーションに移動し、次にAccountControllerのLogout [HttpPost]メソッド内で、次の変更を行います。

public async Task<IActionResult> Logout(LogoutViewModel model)
{
   ...    
  //return View("LoggedOut", vm);
  return Redirect(vm.PostLogoutRedirectUri);
}

これにより、ユーザーはMVCアプリケーションにリダイレクトされます(あなたの場合)。

これを行うには、より良い方法があります。次のように、AccountOptions.csからこれらのオプションを設定できます。

public static bool ShowLogoutPrompt = false;
public static bool AutomaticRedirectAfterSignOut = true;
26
heyAkhilesh

Scaffoldingを使用している場合(Razorページファイルを使用している場合)、Akhileshの回答に従って修正する方法は次のとおりです。

Areas\Identity\Pages\Account\Logout.cshtml:

まず、IIdentityServerInteractionServiceサービスを追加します。

_    IIdentityServerInteractionService _interaction;

    public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger, IIdentityServerInteractionService _interaction)
    {
        _signInManager = signInManager;
        _logger = logger;
        this._interaction = _interaction;
    }
_

OnGet()のサポートを追加する必要がある場合があります。ロジックはおそらくケースによって異なります。私の場合、GetとPostは関係ありません。

_    public async Task<IActionResult> OnGet(string returnUrl = null)
    {
        return await this.OnPost(returnUrl);
    }
_

OnPostにLogoutIdロジックを追加します。

_    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