我正在努力将.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;
}
}
答案 0 :(得分:2)
我试过这个(下面),但它在/ connect / endsession网址上抛出404。我认为令牌对于网址太大(2700+个字符)。
来自美国西北部(IE)的某些浏览器和某些部署(例如Azure上的IIS)默认情况下将URL长度限制为2K。
对于Azure,有一个配置解决方法 - IE只是一个事实。
两个选项:
答案 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;});注销并重定向回来。
希望所有这些混乱都可以帮助其他人!