身份服务器 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 客户端,请进行以下更改:

  1. 将 IdentityServer 中的客户端配置更改 PostLogoutRedirectUris 如下:
PostLogoutRedirectUris = { "http://localhost:55690/signout-callback-oidc"

  1. 在 MVC 客户端的 OpenId 连接设置中删除 SignedOutRedirectUriSignedOutCallbackPath

AccountOptions - AutomaticRedirectAfterSignOut 的默认值为 false,您可能会看到如下图所示的页面,要求单击 here 返回 mvc 客户端:

对于自动重定向,您可以在 IdentityServer 项目上将 AccountOptions - AutomaticRedirectAfterSignOut 设置为 true。

Here是我自己做的样例