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クライアントに自動的にリダイレクトされるはずです。
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;
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();
}
}
_