外部注销后如何重定向到设置注销页面(openid Connect)Asp net core 3.1

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)

在 loginprovider 中设置的重定向 uri: 在 loginprovider 中设置的重定向 URI

我最接近重定向(根本没有调用 OnPost 函数)是使用 RemoteSignOutPath,但这只是在 /Identity/Account/Logout 处返回一个空白页面。

编辑:澄清一下,现在我可以注销并调用 OnPost 函数,但是在注销时,用户被重定向到 loginproviders 自己的 /loggedout 页面,其中包含有关用户从应用程序注销的信息。

And*_*ndy 5

注销不应返回任何 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

请使用这个简单的示例:

  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)
  1. 像这样更新 html 视图:
<a class="dropdown-item" asp-action="Logout" asp-controller="Account">Logout</a>
Run Code Online (Sandbox Code Playgroud)