Lae*_*nde 5 c# asp.net openid-connect asp.net-core
我正在尝试使用 OpenId Connect (oidc) 作为登录提供者为网页(asp net core 3.1)实现外部登录/注销。登录工作正常,但注销重定向未按预期工作。我确信有一个简单的修复方法,但我对 .NET 开发还很陌生。这是我迄今为止尝试过但没有成功的方法:
注销的 HTML 如下所示:
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout">
<button type="submit" class="nav-link btn btn-link text-light">Logg ut</button>
</form>
Run Code Online (Sandbox Code Playgroud)
Logout.cshtml.cs:
//public async Task<IActionResult> OnPost(string returnUrl = null)
//{
// await _signInManager.SignOutAsync();
// await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
// _logger.LogInformation("User logged out.");
// if (returnUrl != null)
// {
// return LocalRedirect(returnUrl);
// }
// else
// {
// return RedirectToPage();
// }
//}
public async Task<IActionResult> OnPost()
{
var user = HttpContext.User;
if (user?.Identity.IsAuthenticated == true)
{
await _signInManager.SignOutAsync();
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
//await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
var callbackUrl = Url.Page("/Account/Logout", pageHandler: null, values: null, protocol: Request.Scheme);
return SignOut(new AuthenticationProperties { RedirectUri = callbackUrl }, CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme);
}
Run Code Online (Sandbox Code Playgroud)
在启动.cs
//options.SignedOutCallbackPath = "/Identity/Account/Logout";
options.SignedOutRedirectUri = "/Identity/Account/Logout";
//options.RemoteSignOutPath = "/Identity/Account/Logout";
options.Events = new OpenIdConnectEvents
{
//OnSignedOutCallbackRedirect = (c) =>
//{
// c.Response.Redirect("/Identity/Account/Logout)");
// c.HandleResponse();
// return Task.CompletedTask;
//},
Run Code Online (Sandbox Code Playgroud)
我最接近重定向(根本没有调用 OnPost 函数)是使用 RemoteSignOutPath,但这只是在 /Identity/Account/Logout 处返回一个空白页面。
编辑:澄清一下,现在我可以注销并调用 OnPost 函数,但是在注销时,用户被重定向到 loginproviders 自己的 /loggedout 页面,其中包含有关用户从应用程序注销的信息。
注销不应返回任何 IActionResult,而应如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
}
Run Code Online (Sandbox Code Playgroud)
如果要设置重定向到的位置,则可以将其作为参数传递给 SignOutAsync 方法,如下所示:
var prop = new AuthenticationProperties()
{
RedirectUri = redirectUri
};
Run Code Online (Sandbox Code Playgroud)
然后将其传递给 SignOutAsync 方法,如下所示:
await context.SignOutAsync(OpenIdConnectDefaults, prop);
Run Code Online (Sandbox Code Playgroud)
试一试!
小智 1
请使用这个简单的示例:
[HttpGet]
public async Task<IActionResult> Logout()
{
var user = HttpContext.User;
if (user?.Identity.IsAuthenticated == true)
{
await _signInManager.SignOutAsync();
}
return View("Home");
}
Run Code Online (Sandbox Code Playgroud)
<a class="dropdown-item" asp-action="Logout" asp-controller="Account">Logout</a>
Run Code Online (Sandbox Code Playgroud)