Identity Server 4 Silent Renew 错误响应:login_required

Posted

技术标签:

【中文标题】Identity Server 4 Silent Renew 错误响应:login_required【英文标题】:Identity Server 4 Silent Renew ErrorResponse: login_required 【发布时间】:2020-03-15 11:41:54 【问题描述】:

我已经从redux-oidc-example 克隆了 repo,它大部分都可以工作,但几个小时后它给出了以下错误:

操作负载:错误响应:login_required 在新 e (oidc-client.min.js:1) 在 t [as _processSigninParams] (oidc-client.min.js:1) 在 t [作为 validateSigninResponse] (oidc-client.min.js:1) 在 oidc-client.min.js:1

UserManager.js 看起来像这样:

const userManagerConfig = 
  client_id: 'js.dev',
  client_secret: 'secret',
  redirect_uri: `$window.location.protocol//$window.location.hostname$window.location.port ? `:$window.location.port` : ''/callback`,
  response_type: 'id_token token',
  scope: 'openid email profile role offline_access',
  authority: 'http://localhost:8080',
  silent_redirect_uri: `$window.location.protocol//$window.location.hostname$window.location.port ? `:$window.location.port` : ''/silent_renew.html`,
  automaticSilentRenew: true,
  filterProtocolClaims: true,
  loadUserInfo: true
;

和我的身份服务器配置:


        "Enabled": true,
        "ClientId": "js.dev",
        "ClientName": "javascript Client",
        "ClientSecrets": [  "Value": "K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols="  ],
        "AllowedGrantTypes": [ "implicit", "authorization_code" ],
        "AllowedScopes": [ "openid", "email", "profile", "role", "offline_access" ],
        "AllowOfflineAccess": true,
        "AllowAccessTokensViaBrowser":true,
        "RedirectUris": [
          "http://localhost:8081/callback",
          "http://localhost:8081/silent_renew.html"
        ],
        "PostLogoutRedirectUris": [
          "http://localhost:8081"
        ],
        "AccessTokenLifetime": 900,
        "RequireConsent": false
      

我注意到在错误之前最后一个有效响应有一个 cookie 响应(idsrv.session),其值为空,到期日期设置为上一年:

我认为这是问题的根本原因,我在相关的 Github repo 上搜索并尝试将 Cookie.SameSite 添加到 none 但没有帮助:

services.AddAuthentication()
                .AddSaml(Configuration,externalProviders.UseSaml)
                .AddCookie(options => 
                    options.SlidingExpiration = true;
                    options.ExpireTimeSpan = TimeSpan.FromDays(30);
                    options.Cookie.SameSite = SameSiteMode.None;
                );

任何想法!

【问题讨论】:

【参考方案1】:

这可能是由于您的 IDP 会话即将到期 - 如果您使用 prompt=none 调用 authorize 端点但由于不存在有效会话(即身份验证 cookie 不存在或已过期)而无法满足该请求,那么它将返回error=login_required

如果发生这种情况,那么正确的做法是在***浏览器窗口中执行交互式(即prompt=login)登录请求。

【讨论】:

【参考方案2】:

搜索Identity Server 4 repo后,我对我的代码做了如下修改:

services.AddIdentityServer(options=>
                
                    options.Authentication.CookieLifetime = TimeSpan.FromDays(30);
                    options.Authentication.CookieSlidingExpiration = true;
                )
                .AddProfileService<ProfileService>()
                .AddSigningCertificate(Configuration)
                .AddInMemoryClients(Configuration.GetSection("IdentityServer:Clients"))
                .AddInMemoryIdentityResources(Resources.GetIdentityResources());

它后来开始工作,但你必须在关闭浏览器或重新打开一个新标签后重新登录我猜这是因为sessionStorage。

【讨论】:

我遇到了同样的问题。你最终解决了你的问题吗? 您能否报告您的整个 ConfigureServices 方法?如果您愿意,可以评论我自己的问题***.com/questions/63901667/… 当然,我没有足够的空间在这里输入,我会发布你的问题。【参考方案3】:

当会话到期时,STS 将调用 signin-callback,它有一个名为 'error' 的查询参数,其值为 'login_required'。

在登录回调中,在完成登录之前,您可以检查此查询参数,如果找到,您也可以从您的 Web 客户端注销。

【讨论】:

以上是关于Identity Server 4 Silent Renew 错误响应:login_required的主要内容,如果未能解决你的问题,请参考以下文章

text Identity Server 4 - .netcore 2

使用 Identity Server 4 和 ASP.NET Identity 添加外部登录

使用Identity Server 4建立Authorization Server

使用Identity Server 4建立Authorization Server

使用Identity Server 4建立Authorization Server

视频Identity Server 4 - 02. OAuth 2.0 简介(下)