身份服务器 4 Post 注销 URL 空
Identity Server 4 Post Logout URL Null
我在尝试弄清楚如何让 post 注销 URL 在我的 ASP.NET 核心 MVC 应用程序中工作时遇到了一些问题。我一直在关注 Identity Server 文档和其他 posts 中的示例,但我不太确定哪里出错了。用户成功注销应用程序,然后重定向到身份服务器并在那里注销,但我注意到 id_token 参数没有传递给身份服务器,所以即使 post 注销参数存在,但未被使用。
我的中间件配置看起来是正确的,我觉得我创建应用程序 cookie 的方式有问题,并且令牌并没有真正保存在可以重复使用的任何地方。
我目前只使用“代码”响应类型,但这似乎还包括身份令牌和授权令牌。
Startup.cs:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "oidc";
})
.AddJwtBearer("Bearer", options =>
{
options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
options.RequireHttpsMetadata = false;
options.Audience = Configuration["IdentityServerSettings:Audience"];
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect("oidc", options =>
{
options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
options.ClientId = "myClient";
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.SignedOutRedirectUri = "http://localhost:55690/account/logoutcallback";
options.SignedOutCallbackPath = "/account/logoutcallback";
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});
AccountController.cs
注销方法:
public async Task<IActionResult> Logout()
{
return new SignOutResult(new[] { CookieAuthenticationDefaults.AuthenticationScheme, "oidc" });
}
public async Task<IActionResult> LogoutCallback()
{
return RedirectToAction(nameof(Dashboard), "Account");
}
登录回调:
if (!Request.Query.ContainsKey("code"))
throw new Exception($"Request query string does not contain an authorization code. Query string: {Request.QueryString.Value}");
var authCode = Request.Query["code"].ToString();
TokenResponse tokenResponse = null;
using (var httpClient = new HttpClient())
{
tokenResponse = await httpClient.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
{
Address = _configuration["IdentityServerDashboardSettings:TokenUrl"],
ClientId = _configuration["IdentityServerDashboardSettings:ClientId"],
RedirectUri = _configuration["IdentityServerDashboardSettings:RedirectUrl"],
Code = authCode
});
}
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadToken(tokenResponse.AccessToken) as JwtSecurityToken;
var identity = new ClaimsIdentity(jwtToken.Claims, CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim("id_token", tokenResponse.IdentityToken));
var claimsPrinciple = new ClaimsPrincipal();
claimsPrinciple.AddIdentity(identity);
await HttpContext.SignInAsync(claimsPrinciple);
return RedirectToAction(nameof(Dashboard), "Account");
其他一切正常,SignOutResult 成功构造注销 URL 并重定向到 Identity Server,但它缺少参数中的 id_token。我真的找不到任何关于我应该如何存储它供以后使用的例子,我遇到的很多例子似乎只是自动工作。是不是我配置有误?
要重定向回 MVC 客户端,请进行以下更改:
- 将 IdentityServer 中的客户端配置更改
PostLogoutRedirectUris
如下:
PostLogoutRedirectUris = { "http://localhost:55690/signout-callback-oidc"
- 在 MVC 客户端的 OpenId 连接设置中删除
SignedOutRedirectUri
和 SignedOutCallbackPath
AccountOptions
- AutomaticRedirectAfterSignOut
的默认值为 false,您可能会看到如下图所示的页面,要求单击 here
返回 mvc 客户端:
对于自动重定向,您可以在 IdentityServer 项目上将 AccountOptions
- AutomaticRedirectAfterSignOut
设置为 true。
Here是我自己做的样例
我在尝试弄清楚如何让 post 注销 URL 在我的 ASP.NET 核心 MVC 应用程序中工作时遇到了一些问题。我一直在关注 Identity Server 文档和其他 posts 中的示例,但我不太确定哪里出错了。用户成功注销应用程序,然后重定向到身份服务器并在那里注销,但我注意到 id_token 参数没有传递给身份服务器,所以即使 post 注销参数存在,但未被使用。
我的中间件配置看起来是正确的,我觉得我创建应用程序 cookie 的方式有问题,并且令牌并没有真正保存在可以重复使用的任何地方。
我目前只使用“代码”响应类型,但这似乎还包括身份令牌和授权令牌。
Startup.cs:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "oidc";
})
.AddJwtBearer("Bearer", options =>
{
options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
options.RequireHttpsMetadata = false;
options.Audience = Configuration["IdentityServerSettings:Audience"];
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect("oidc", options =>
{
options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
options.ClientId = "myClient";
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.SignedOutRedirectUri = "http://localhost:55690/account/logoutcallback";
options.SignedOutCallbackPath = "/account/logoutcallback";
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});
AccountController.cs
注销方法:
public async Task<IActionResult> Logout()
{
return new SignOutResult(new[] { CookieAuthenticationDefaults.AuthenticationScheme, "oidc" });
}
public async Task<IActionResult> LogoutCallback()
{
return RedirectToAction(nameof(Dashboard), "Account");
}
登录回调:
if (!Request.Query.ContainsKey("code"))
throw new Exception($"Request query string does not contain an authorization code. Query string: {Request.QueryString.Value}");
var authCode = Request.Query["code"].ToString();
TokenResponse tokenResponse = null;
using (var httpClient = new HttpClient())
{
tokenResponse = await httpClient.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
{
Address = _configuration["IdentityServerDashboardSettings:TokenUrl"],
ClientId = _configuration["IdentityServerDashboardSettings:ClientId"],
RedirectUri = _configuration["IdentityServerDashboardSettings:RedirectUrl"],
Code = authCode
});
}
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadToken(tokenResponse.AccessToken) as JwtSecurityToken;
var identity = new ClaimsIdentity(jwtToken.Claims, CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim("id_token", tokenResponse.IdentityToken));
var claimsPrinciple = new ClaimsPrincipal();
claimsPrinciple.AddIdentity(identity);
await HttpContext.SignInAsync(claimsPrinciple);
return RedirectToAction(nameof(Dashboard), "Account");
其他一切正常,SignOutResult 成功构造注销 URL 并重定向到 Identity Server,但它缺少参数中的 id_token。我真的找不到任何关于我应该如何存储它供以后使用的例子,我遇到的很多例子似乎只是自动工作。是不是我配置有误?
要重定向回 MVC 客户端,请进行以下更改:
- 将 IdentityServer 中的客户端配置更改
PostLogoutRedirectUris
如下:
PostLogoutRedirectUris = { "http://localhost:55690/signout-callback-oidc"
- 在 MVC 客户端的 OpenId 连接设置中删除
SignedOutRedirectUri
和SignedOutCallbackPath
AccountOptions
- AutomaticRedirectAfterSignOut
的默认值为 false,您可能会看到如下图所示的页面,要求单击 here
返回 mvc 客户端:
对于自动重定向,您可以在 IdentityServer 项目上将 AccountOptions
- AutomaticRedirectAfterSignOut
设置为 true。
Here是我自己做的样例