gpt4 book ai didi

c# - 从 .NET Core 注销 IdentityServer4 让我重新登录

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:10 25 4
gpt4 key购买 nike

我正在努力将 .NET MVC 5 应用程序转换为核心。我正在使用 IdentityServer4 进行身份验证/授权,但我似乎无法让注销工作。

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

我正在使用此行注销,但是当我看到它时,它会将我重定向回登录 url(因为您需要对“/”进行身份验证)并且它会自动让我重新登录。我试图在注销方法中删除 cookie 并且没有骰子。

在用户重新登录之外的 IdentityServer 日志中没有任何内容,所以我认为这不是配置问题(在 MVC5 中工作)。其他人遇到过这个问题吗?我认为这是我遗漏或错误注销的一个小配置问题。

我已经尝试过了(如下),但它在/connect/endsession url 上抛出了 404。我认为 token 对于 url 来说太大了(2700 多个字符)。
public async Task Logout()
{
return SignoutAsycn("Cookies", "oidc");
}

我唯一的想法是,在 MVC5 应用程序中工作时,我使用 url localhost.xyz.com 进行调试,登录服务器是 login.xyz.com。现在我正在使用 localhost:44300 和 login.xyz.com 进行调试。重定向 url 设置为 https://localhost:44300 .

任何帮助,将不胜感激。

编辑

因此,我添加了 fiddler 以观察 Core 版本和 .NET 版本之间发生的情况,当我在 .NET 版本中注销时,您可以看到对 IS4 服务的一些调用(尽管我看不到详细信息)和一切正常。

在核心版本中,没有对 IS4 的调用。我可以看到重定向时 cookie 已被删除,但 oidc 信息似乎完好无损。

/.well-know/信息看起来也是正确的。

编辑

点击注销时记录

2017-07-24T13:42:38.4069514-04:00 0HL6INDDIPV32 [INF] 请求开始 HTTP/1.1 GET http://localhost:44300/Account/Logout (e5be5b71)

2017-07-24T13:42:38.4164473-04:00 0HL6INDDIPV32 [INF] HttpContext.User 通过来自 authenticationScheme 的 AutomaticAuthentication 合并:“Cookies”。 (bdba1d38)

2017-07-24T13:42:38.4264444-04:00 0HL6INDDIPV32 [INF] 使用参数(null)执行操作方法“Framework.Controllers.AccountController.Logout(框架)”-ModelState 有效(ba7f4ac2)

2017-07-24T13:42:40.3758113-04:00 0HL6INDDIPV32 [INF] AuthenticationScheme:“Cookies”已成功通过身份验证。 (1805f3b3)

2017-07-24T13:42:40.3878092-04:00 0HL6INDDIPV32 [INF] AuthenticationScheme:“oidc”已注销。 (d3f50c8d)

2017-07-24T13:42:40.4048013-04:00 0HL6INDDIPV32 [INF] AuthenticationScheme:“Cookies”已注销。 (d3f50c8d)

2017-07-24T13:42:40.4127980-04:00 0HL6INDDIPV32 [INF] 执行 RedirectResult,重定向到“/”。 (d98d540e)

2017-07-24T13:42:40.4167958-04:00 0HL6INDDIPV32 [INF] 在 1993.1739 毫秒 (afa2e885) 中执行操作“Framework.Controllers.AccountController.Logout (Framework)”

2017-07-24T13:42:40.4508858-04:00 0HL6INDDIPV32 [INF] 请求在 2047.3797ms 302 (15c52c40) 内完成

2017-07-24T13:42:40.4558821-04:00 0HL6INDDIPV33 [INF] 请求开始 HTTP/1.1 GET http://localhost:44300/ (e5be5b71)

2017-07-24T13:42:40.4668910-04:00 0HL6INDDIPV33 [INF] 用户授权失败:null。 (a4ab1676)

2017-07-24T13:42:40.4738760-04:00 0HL6INDDIPV33 [INF] 过滤器“Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter”的请求授权失败。 (8b6446cb)

2017-07-24T13:42:40.4818757-04:00 0HL6INDDIPV33 [INF] 使用身份验证方案 ([]) 执行 ChallengeResult。 (f3dca807)

2017-07-24T13:42:40.5168613-04:00 0HL6INDDIPV33 [INF] AuthenticationScheme:“oidc”受到挑战。 (d45f1f38)

编辑

我更新了代码来做几件事。我从 token 中删除了声明,它现在将调用 endsession 端点,然后重定向我重新登录。我更新了代码以发布到 endsession(如下)和相同的内容。现在,如果我调用 Identity Server 上的/Account/Logout 端点,它仍然不会将我注销。

身份服务器记录状态它收到了对/endsession 端点的请求,并且没有错误。

想法?
private void Signout()
{
var id = httpContext.HttpContext.Authentication.GetTokenAsync("id_token").Result;
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://login.xyz.com:8981/");
var actionName = string.Format("/connect/endsession");
var values = new List<KeyValuePair<string, string>>();
values.Add(new KeyValuePair<string, string>("id_token_hint", id));
values.Add(new KeyValuePair<string, string>("post_logout_redirect_uri", "https://localhost:44300/"));
var content = new FormUrlEncodedContent(values);
var response = httpClient.PostAsync(actionName, content);
if (response.Result.IsSuccessStatusCode)
{
var item = response.Result.Content.ReadAsStringAsync();
var t = string.Empty;
}
}

最佳答案

I have tried this (below) but it throws a 404 on the /connect/endsession url. I think the token is too large for the url (2700+ characters).



来自美国西北部 (IE) 的某些浏览器和某些部署(例如 Azure 上的 IIS)默认将 URL 长度限制为 2K。

对于 Azure,有一个配置解决方法 - IE 只是生活中的事实。

两种选择:
  • 使您的身份 token 更小(更少声明)
  • end_session 端点也支持 POST - 您可以发布参数而不是执行 GET。 IIRC 中间件不支持 OOB - 因此您需要自己提出网络请求。
  • 关于c# - 从 .NET Core 注销 IdentityServer4 让我重新登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45271104/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com