具有 Identity Server4 并发登录的隐式授予 SPA

2024-04-04

如何使用授权类型限制特定 SPA 客户端中每个客户端应用程序的 x 登录次数 - 隐式

这超出了身份服务器的范围 https://github.com/IdentityServer/IdentityServer4/issues/736

尝试过的解决方案 -

  1. 访问令牌保留到数据库,但是这种方法客户端不断更新访问令牌而无需编写代码,因为客户端浏览器请求带有有效令牌,尽管其已过期,静默身份验证正在通过发出新的引用令牌来更新令牌(这可以见表 persistGrants token_type 'reference_token')

  2. Cookie 事件 - 在 validateAsync 上 - 虽然这仅适用于服务器 Web,但运气不太好,我们不能将此逻辑放在 SPA 客户端的 oidc 库上。

  3. 通过重写 SignInAsync 自定义 SignInManager - 但在调试模式下执行未达到此点,因为 IDM 不断识别用户具有有效令牌(尽管已过期)并不断重新颁发令牌(请注意,此处没有刷新令牌可供管理)通过存储和修改来实现!!!)

即使访问令牌已过期,IDM 如何在不带用户登录屏幕的情况下重新颁发令牌的任何线索??(静默身份验证 https://auth0.com/docs/api-auth/tutorials/silent-authentication. ??


实施配置文件服务覆盖activesync

  public override async Task IsActiveAsync(IsActiveContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await userManager.FindByIdAsync(sub);

        //Check existing sessions
        if (context.Caller.Equals("AccessTokenValidation", StringComparison.OrdinalIgnoreCase))
        {
            if (user != null)
                context.IsActive = !appuser.VerifyRenewToken(sub, context.Client.ClientId);
            else
                context.IsActive = false;
        }
        else
            context.IsActive = user != null;
    }

startup

services.AddTransient<IProfileService, ProfileService>();

将身份服务器服务添加到配置服务下的集合中时

 .AddProfileService<ProfileService>();

Update

Session.Abandon(); //is only in aspnet prior versions not in core
Session.Clear();//clears the session doesn't mean that session expired this should be controlled by addSession life time when including service.

我碰巧找到了一种更好的方法,即使用 aspnetuser securitystamp,每次用户登录时都会更新安全标记,以便任何先前的活动会话/cookie 都将失效。

_userManager.UpdateSecurityStampAsync(_userManager.FindByEmailAsync(model.Email).Result).Result

更新(最终):

登录时:-

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberLogin, false);
                if (result.Succeeded)
                {
            //Update security stamp to invalidate existing sessions           
                    var user = _userManager.FindByEmailAsync(model.Email).Result;
                    var test= _userManager.UpdateSecurityStampAsync(user).Result;
                    //Refresh the cookie to update securitystamp on authenticationmanager responsegrant to the current request
                    await _signInManager.RefreshSignInAsync(user);
          }

配置文件服务实施:-

public class ProfileService : ProfileService<ApplicationUser>

{
public override async Task IsActiveAsync(IsActiveContext context)
        {
            if (context == null) throw new ArgumentNullException(nameof(context));
            if (context.Subject == null) throw new ArgumentNullException(nameof(context.Subject));

            context.IsActive = false;

            var subject = context.Subject;
            var user = await userManager.FindByIdAsync(context.Subject.GetSubjectId());

            if (user != null)
            {
                var security_stamp_changed = false;

                if (userManager.SupportsUserSecurityStamp)
                {
                    var security_stamp = (
                        from claim in subject.Claims
                        where claim.Type =="AspNet.Identity.SecurityStamp"
                        select claim.Value
                        ).SingleOrDefault();

                    if (security_stamp != null)
                    {
                        var latest_security_stamp = await userManager.GetSecurityStampAsync(user);
                        security_stamp_changed = security_stamp != latest_security_stamp;
                    }
                }

                context.IsActive =
                    !security_stamp_changed &&
                    !await userManager.IsLockedOutAsync(user);
            }
        }
    }   

*

挂钩服务集合:-

*

services.AddIdentityServer()
    .AddAspNetIdentity<ApplicationUser>()                
         .AddProfileService<ProfileService>();

即每次登录时,用户的安全标记都会更新并推送到 cookie,当令牌过期时,授权端点将验证安全更改,如果有任何更改,则重定向用户登录。这样我们就可以确保只有一个活动会话

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 Identity Server4 并发登录的隐式授予 SPA 的相关文章

随机推荐

  • 类只有静态字段和方法是不好的做法吗?

    我有一堂课 其中包括only静态成员变量和静态方法 本质上 它充当通用实用程序类 类只包含静态成员变量和静态方法是不好的做法吗 不 我一点也不这么认为 拥有一个充满实例方法的类是更糟糕的做法 而这些实例方法实际上并不依赖于特定实例 使它们静
  • int b=0,a=1;b=++a+++a; b 的值是多少?它的计算方法是什么? [复制]

    这个问题在这里已经有答案了 int main int b 0 a 1 initialize a and b b a a calculate assign the value of b print f d b return 0 b 的值是多少
  • CMake不知道Qt4 qmake在哪里

    我正在使用 Debian 操作系统 我试图指出 cmake 我的 Qt4 在哪里 我尝试构建 qjson 库及其 CMakeLists txt http pastebin com fKNp0Qgy http pastebin com fKN
  • 如何使用 os.listdir 仅选择一种文件类型?

    连接同一图像的 10 个条带后 我想将它们转换为反射率 然后将它们除以 10 000 尽管如此 我的文件夹中有两种类型的文件 但我只想将代码应用于 my img 文件而不是 hdr 您知道我如何使用 os listdir 进行此选择吗 我的
  • Jenkins 多配置项目处理并发设备使用

    Case 我有一个詹金斯奴隶女巫在移动设备 android ios 上运行葫芦测试 为了区分测试在哪些机器 iOS 的 mac 或 Android 的 Linux 上运行 我还使用Throttle 并发构建插件 通过这种方式 我可以区分设备
  • Spring Boot + Spring Security + CORS 中没有“Access-Control-Allow-Origin”

    我正在尝试使用 Spring security 进行 CORS 这是我的 WebSecurityConfigurerAdapter Configuration public class SecurityConfig extends WebS
  • 仅允许从触发器内插入

    我是 SQL 编程新手 我在网上找不到这个问题的答案 我正在使用 pl pgsql 希望获得以下结果 我有一个具有某些属性的表 A 我应该随时更新此表 因此 每当进行可能影响 A 值的更改 在与 A 相关的其他表 B 或 C 中 时 都会触
  • 如何删除启动画面之前出现的白屏?

    打开 java 文件时 我首先看到空白屏幕 然后出现闪屏布局 我有java文件 new Handler postDelayed new Runnable Override public void run Task finish ARG SP
  • 与 HibernateTemplate 和 SessionFactory 的单个数据库连接

    在java方面 一切工作正常 但是当我查看V SESSION特殊的oracle表 以及记录任何登录或注销操作的日志表时 这是一场灾难 每个查询都会执行登录 注销操作 所以这是我的问题 有没有办法配置 Spring 与数据库有一个唯一的连接
  • 从 .vbs 文件调用 VBA 宏会引发 800A03EC 错误

    我正在尝试通过 VBS 文件 文件名 Check final vbs 运行 VBA 宏 这是代码 Option Explicit run macro Sub run macro Dim xl1 Dim sCurPath Dim xlBook
  • 空响应返回 204

    当我执行 GET 请求但没有找到任何数据时 我的控制器返回 204 Route user v1 controller public class UserLoginController Controller HttpGet public as
  • 使用 Moq 模拟存储库

    为了模拟存储库 我使用下面的代码 我不明白为什么变量empl总是null 你知道我错过了什么吗 Thanks TestMethod public void Test var employee new Employee EmployeeID
  • Plotly.express choropleth 仅显示一种颜色

    我正在尝试使用创建一个 choroplethplotly express 该图能够加载 但它只显示一种颜色 我可以将鼠标悬停在每个功能上 它会显示相关信息 但不以可变颜色显示 这意味着它正在读取 geojson 但无法正确显示 u geds
  • 情节子图与规格问题,值错误

    我正在尝试使用辅助 y 轴和绘图子图绘制 3 个子图 但无论我如何尝试 仍然会遇到此类错误 值错误 make subplots 的 specs 参数必须是维度为 3 x 1 的字典的 2D 列表 收到类型 的值 secondary y Tr
  • 捆绑 JavaScript 课程 Uncaught SyntaxError: Unexpected token <

    使用mvc4课程的bundle功能 未捕获的语法错误 意外的标记 加载时 和debug true 一切都像例外一样工作 我该如何解决该错误 或 者我可以禁用脚本的捆绑功能吗 Solved 重命名了捆绑包名称 使其与任何目录都不匹配 在回答导
  • unlink 和 rm 在 unix 上的区别

    这两个命令之间真正的区别是什么 为什么删除文件的系统调用叫unlink代替delete 你需要了解一些关于原始 Unix 文件系统的知识才能理解这个非常重要的问题 与同时代的其他操作系统 60 年代末 70 年代初 不同 Unix 没有将文
  • 为什么我的网络浏览器版本的 java 与命令行版本不同

    the Safari browser says I am running 7 But the command line says I am running 6 prg ceylon dist samples helloworld java
  • Angular 方式将表单数据提交到 iframe

    我有像下面这样的html
  • 定时器在待机模式下会发生什么情况? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 具有 Identity Server4 并发登录的隐式授予 SPA

    如何使用授权类型限制特定 SPA 客户端中每个客户端应用程序的 x 登录次数 隐式 这超出了身份服务器的范围 https github com IdentityServer IdentityServer4 issues 736 尝试过的解决