从.NET Core注销IdentityServer4会让我回到

时间:2017-07-24 00:27:01

标签: c# asp.net asp.net-core identityserver4

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

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

我正在使用此行注销,但是当我这样做时,我看到它会将我重定向回登录网址(因为您需要对" /"进行身份验证)并且它会自动重新登录。我试图在注销方法中删除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

任何帮助都将不胜感激。

修改

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

在Core版本中没有调用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]执行操作方法" Framework.Controllers.AccountController.Logout(Framework)" with arguments(null) - 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]已执行的操作" Framework.Controllers.AccountController.Logout(Framework)"在1993.1739ms(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]过滤器请求的授权失败""&n; Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter"&#39 ;。 (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)

修改

我更新了代码以执行一些操作。我从令牌中删除了声明,它现在将调用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;
    }
}

2 个答案:

答案 0 :(得分:2)

  

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

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

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

两个选项:

  • 使您的身份令牌更小(声明更少)
  • end_session端点也支持POST - 您可以发布参数而不是执行GET。 IIRC中间件不支持OOB - 因此您需要自己制作网络请求。

答案 1 :(得分:1)

发现它!

多个问题

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 [] {&#34; oidc&#34;,&#34; Cookies&#34;});注销并重定向回来。

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

相关问题