检测IdentityServer用户是否在匿名用户可用的页面上登录

时间:2018-04-04 16:51:45

标签: asp.net-mvc identityserver4

将Identity Core 4作为身份提供者使用ASP.NET Core 2应用程序。使用两个使用上述应用程序作为身份验证权限的ASP.NET MVC 5应用程序。使用隐式流进行身份验证。

第一个应用程序没有任何页面可供匿名用户使用,因此当未经身份验证的用户导航到该页面时,会将其重定向到IdSrv应用程序进行登录。让我们调用它&#34; < em>管理员门户&#34;

第二个应用程序的欢迎页面可供匿名用户使用,未经身份验证的用户在访问时不会自动重定向到IdSrv应用程序。 但是,如果他们尝试访问匿名用户无法访问的某个页面,则身份验证组件会执行其工作并将用户重定向到IdSrv以进行身份​​验证。
如果经过身份验证的用户导航到此欢迎页面,则应用程序会自动将其重定向到其他页面(即仪表板页面),这对匿名用户不可用。让我们调用第二个应用程序&#34; 用户门户&#34;。

现在解决问题。
考虑用户登录管理门户并稍后转到用户门户的情况。即使用户已使用管理员门户登录系统,当他们导航到用户门户时,他们可能会通过欢迎页面进行操作,但不会检测用户是否已登录,因为欢迎页面允许匿名访问。

对于已经过身份验证的用户,理想的行为是自动从欢迎页面重定向到某个仪表板页面

允许匿名访问的页面是否有可能以某种方式询问IdentityServer当前用户是否已经过身份验证?如果未经过身份验证,则只显示内容,如果已经过身份验证,则会执行重定向到适合经过身份验证的用户的其他页面。

我之前解决了这个问题(我当时没有使用过IdentityServer),让身份验证服务知道匿名用户允许哪些页面,并在每次请求时将所有未经身份验证的用户重定向到登录页面。然后,身份验证服务将读取 returnUrl 值,如果它与其中一个允许的页面匹配,则只会将用户重定向回匿名页面,并添加&#34; anonymous = 1&#34;查询参数以防止无限循环。拥有&#34; anonymous = 1&#34; query参数将指示应用程序不将未经身份验证的用户重定向到身份验证服务。但这看起来很糟糕。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

正如McGuireV10所提到的,您可以在此处使用来自客户端的prompt = none方法。您在隐藏的iframe中发出授权端点请求,如果响应返回OK(即不是login_required),那么您就知道用户已经在IDP上进行了身份验证。它实施起来有点繁琐,但它是一种“官方”方法,是会话监控规范的一部分。