首页 文章

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

提问于
浏览
1

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

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

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

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

我试过这个(下面),但它在/ connect / endsession网址上抛出404 . 我认为令牌对于网址来说太大了(2700个字符) .

public async Task Logout()
{
    return SignoutAsycn("Cookies", "oidc");
}

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

任何帮助,将不胜感激 .

EDIT

所以我添加了fiddler来观察Core版本和.NET版本之间发生的事情,当我在.NET版本中注销时,您可以看到有一些调用IS4服务(虽然我看不到详细信息)和一切正常 .

在Core版本中,没有对IS4的调用 . 我可以看到已经在重定向上删除了cookie,但是oidc信息似乎完好无损 .

/.well-know/信息也是正确的 .

EDIT

点击退出时记录

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(Framework)” - 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.1739ms执行动作“Framework.Controllers.AccountController.Logout(Framework)”(afa2e885)

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)

EDIT

我更新了代码来做一些事情 . 我从令牌中删除了声明,它现在将调用endsession终点,然后重定向我重新登录 . 我更新了代码以发布到endsession(下面)和同样的东西 . 现在,如果我在Identity Server上调用/ Account / Logout endpoints ,它仍然不会将我注销 .

身份服务器日志表明它收到了对/ endsession endpoints 的请求,并且没有错误 .

思考?

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;
    }
}

2 回答

  • 1

    我尝试了这个(下面),但它在/ connect / endsession网址上抛出404 . 我认为令牌对于网址来说太大了(2700个字符) .

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

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

    两种选择:

    • 使您的身份令牌变小(声明减少)

    • end_session endpoints 也支持POST - 您可以发布参数而不是执行GET . IIRC中间件没有支持OOB - 因此您需要制作自己的网络请求 .

  • 2

    找到了!

    多个问题

    A)我在BuildLoggedOutViewModelAsync函数中发现了一个问题,即正确获取PostLogoutRedirectUri . 我显然没有把它归还给自己 .

    PostLogoutRedirectUri = logout?.PostLogoutRedirectUri == null 
        ? logout?.Parameters["post_logout_redirect_uri"] 
        : logout?.PostLogoutRedirectUri,
    

    B)Identity Server中的客户端需要PostLogoutRedirectUris具有〜/ signout-callback-oidc,而在.net核心客户端本身,您可以将其设置为永远 .

    然后使用return new SignOutResult(new [] {“oidc”,“Cookies”});注销并重定向回来 .

    希望所有这些混乱都会帮助其他人!

相关问题