我有一个基于ASP.Net MVC构建的人力资源网络应用程序,分为不同的区域,例如经理、员工等。这些区域代表系统中不同类型的用户,可以执行不同的任务。涉及到一个遗留数据库,每种用户类型的信息存储在不同的表中。此外,每种用户类型存储的信息类型不同,因此将表分开是有意义的。
我想实现基于声明的身份验证,原因有几个:一是更容易在客户端上存储有关每个用户的详细信息,如用户名、角色等。另一个原因是ClaimsPrincipal支持多个标识。这很重要,因为在某些情况下,单个人可能需要同时使用多个标识访问系统。例如,经理需要访问系统执行管理任务,但经理也是员工,应该能够以员工身份登录系统。每个区域都是独立处理的,因此即使用户既是经理也是员工,他们也必须分别登录每个区域。
所以我的问题是:通过ClaimsPrincipal实现多个标识是否是正确的方法?我是否忽略了其他技术?如果多个标识是正确的方法,如何在用户从一个区域注销但仍然在另一个区域登录时保持其登录状态?通常,要注销代码看起来像这样:
我的假设是这将使用户退出两个区域。这正确吗? 如果是这样,我认为我可以简单地从ClaimsPrincipal中删除特定的Identity,然后重置并写入SessionSecurityToken,但是ClaimsPrincipal没有remove方法,只有AddIdentity。所以我想出了以下伪代码:
登出时:
我想实现基于声明的身份验证,原因有几个:一是更容易在客户端上存储有关每个用户的详细信息,如用户名、角色等。另一个原因是ClaimsPrincipal支持多个标识。这很重要,因为在某些情况下,单个人可能需要同时使用多个标识访问系统。例如,经理需要访问系统执行管理任务,但经理也是员工,应该能够以员工身份登录系统。每个区域都是独立处理的,因此即使用户既是经理也是员工,他们也必须分别登录每个区域。
所以我的问题是:通过ClaimsPrincipal实现多个标识是否是正确的方法?我是否忽略了其他技术?如果多个标识是正确的方法,如何在用户从一个区域注销但仍然在另一个区域登录时保持其登录状态?通常,要注销代码看起来像这样:
FederatedAuthentication.SessionAuthenticationModule.SignOut();
我的假设是这将使用户退出两个区域。这正确吗? 如果是这样,我认为我可以简单地从ClaimsPrincipal中删除特定的Identity,然后重置并写入SessionSecurityToken,但是ClaimsPrincipal没有remove方法,只有AddIdentity。所以我想出了以下伪代码:
登出时:
- 计算ClaimsPrincipal中身份证数量
- 如果计数==1,则正常注销
- 如果计数>1,则由于我们无法删除身份,因此遍历身份并创建一个新的ClaimsPrincipal,该ClaimsPrincipal排除我们要注销的身份,然后重置并写入SessionSecurityToken