【问题标题】:ASP.NET Core MVC - Logout from external provider with POST requestASP.NET Core MVC - 使用 POST 请求从外部提供程序注销
【发布时间】:2021-08-14 19:02:42
【问题描述】:

基本问题: 我有一个使用 EKOAPP 作为 OpenIdConnect 的外部身份验证提供程序的 APS.NET Core Web 应用程序。我希望我的用户在完成工作后能够退出,但显然 EKOAPP 没有实现会话管理标准。

基本上,从我目前发现的情况来看,从 EKOAPP 实际注销用户的唯一方法是向https://app-h1.eu.ekoapp.com/api/v1/auth/logout 发出 POST 请求,从而使用某种会话 cookie 来识别用户。因此,仅使用 HttpClient 或类似方式发送发布请求是行不通的,因为该 cookie 在后端不可用(因为它来自外部 url)。这意味着某种重定向是不可避免的(据我所知)。

首先,只是尝试的基本尝试:

[HttpPost()]
public async Task Logout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
    // with or without return Redirect("/Home/Index");
}

[HttpPost()]
public async Task<IActionResult> Logout()
{
    return new SignOutResult(new[] { 
        OpenIdConnectDefaults.AuthenticationScheme, 
        CookieAuthenticationDefaults.AuthenticationScheme 
    });
}

只是触发“无法重定向到结束会话端点,退出时配置可能丢失或无效。” => 见Cannot redirect to the end session endpoint, the configuration may be missing or invalid OpenIdConnect SignOutAsync

坦率地说,尝试从那里实施解决方案,什么都没有。据我从浏览器网络日志中可以看出,它甚至都懒得尝试调用注销 url。

对注销有用的一件事是:

[HttpPost()]
public async Task<IActionResult> Logout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    return RedirectPreserveMethod("https://app-h1.eu.ekoapp.com/api/v1/auth/logout");
}

编辑-开始 实际上,它似乎只是起作用,因为它再次显示了登录屏幕 - 但是用户实际上并没有退出。我想我必须放弃这个... 编辑-结束

但是,用户最终会进入 EKOAPP 的登录屏幕,并且在实际登录时停留在 EKOAPP 而不是返回到我的应用程序。

我也尝试了以前端为中心的方法:

$("#logout").on("click", function () {
    $.ajax({
        url: "https://app-h1.eu.ekoapp.com/api/v1/auth/logout",
        xhrFields: {
            withCredentials: !0
        },
        headers: {
            ajax: !0
        },
        method: "post"
    }).done(function () {
        location = "/Home/Index";
    });
})

不幸的是,这只会触发跨域请求异常......

有什么想法吗?这甚至可能是我想要实现的目标吗?

【问题讨论】:

    标签: javascript c# asp.net-mvc asp.net-core openid-connect


    【解决方案1】:

    正如您已经推断的那样,您需要使用基于浏览器的方法,而 AJAX 将无法工作。如果您深入研究 OpenID-Connect 的各种实现,您会发现它包含许多重定向来解决相同类型的限制。

    一种可能的解决方案是在您的注销过程中包含以下内容:

    • 重定向到包含发布到您的提供商的注销端点的表单的页面。
    • 使用 JavaScript 自动发布表单(您还应该包含一个按钮来发布表单,以防 JavaScript 因某种原因失败)。
    • 您的身份验证提供程序应该具有注销重定向位置的配置,并且发布到他们的注销端点应该重定向到该位置。您可以使用它返回您的主页。

    【讨论】:

    • 嗯,EkoApp 只提供一个可以配置的重定向 URL,我必须将其设置为 localhost:5001/signin-oidc 才能使登录工作。但无论如何,关键是让用户真正退出,这不适用于简单的“发布到外部 url”,因为浏览器没有附加适当的 cookie,这意味着 EkoApp 无法识别用户跨度>
    • 注销 URL 应该接收登录设置的 cookie,除非它们是为不同的域设置的,在这种情况下,我会质疑这是否是正确的注销 URL。我使用基于 IdentityServer4 的内部身份系统,我上面描述的方式是注销在该系统中的工作方式。最后一点:我假设您正在谈论由登录用户在他们登录的同一浏览器中启动的注销过程。
    • 登录似乎并不介意它是由我们的应用程序发起的,还是由在导航到我们的应用程序之前实际使用过 EkoApp 的用户发起的。据我了解:1.) 用户导航到我们的应用程序 2.) ASP 将用户重定向到 EkoApp 登录页面 3.) 用户登录(cookie 设置在 EkoApp 域中,而不是我们的域中)4.) EkoApp 将用户重定向到定义重定向 url (localhost/signin-oidc) 5.) 用户可以使用我们的应用程序,但显然没有办法注销用户...
    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2016-08-12
    • 2021-03-14
    • 2021-02-13
    • 2018-07-22
    • 2016-05-26
    • 2013-08-19
    相关资源
    最近更新 更多