如何从ClaimsPrincipal中删除ClaimsIdentity

我有一个内置于ASP.Net MVC的HR Web应用程序,分为多个区域,例如Manager,Employee。 这些区域代表系统中能够执行不同任务的不同类型的用户。 涉及遗留数据库,每种用户类型的信息存储在不同的表中。 此外,为每种用户类型存储的信息类型也不同,因此表格是分开的。

我希望实现基于声明的身份validation有以下几个原因:一,在客户端上存储有关每个用户的详细信息(如用户名,角色等)会更容易。另一个原因是ClaimsPrincipal支持多个身份。 这很重要,因为在某些情况下,单个人可能需要同时在多个身份下访问系统。 例如。 Manager需要访问系统才能执行管理任务,但Manager也恰好是Employee,并且应该能够以Employee身份登录系统。 每个区域都是单独处理的,因此即使用户既是管理员又是员工,他们必须分别登录到每个区域。

所以这是我的问题:通过ClaimsPrincipal的多个身份是否可行? 我还有其他一些技巧吗? 如果要使用多个身份,如何将用户从一个区域中注销,但如果他们碰巧同时也登录到另一个区域,请让他们登录到另一个区域? 通常,要注销,代码看起来像这样:

FederatedAuthentication.SessionAuthenticationModule.SignOut(); 

我的假设是,这将使用户退出这两个区域。 它是否正确? 假设是这种情况,我想我可以简单地从ClaimsPrincipal中删除特定的Identity,然后重置并编写SessionSecurityToken,但ClaimsPrincipal没有remove方法,只有AddIdentity。 所以我提出了以下伪代码:

注销时:

  • 计算ClaimsPrincipal中的身份数量
  • 如果count == 1正常退出
  • 如果count> 1,因为我们无法删除标识,循环标识并创建一个新的ClaimsPrincipal,排除我们要注销的标识,然后重置并写入SessionSecurityToken

我是在正确的轨道上吗? 是否有一些很好的例子说明如何在ClaimsPrincipal中实现多个身份? 我已经搜索过了,虽然我发现了多个身份的简要提及,但我没有找到实际的例子。

建议:在您的特定情况下,我们可以有两个ClaimsPrincipal对象处理两个不同的ClaimsIdentity。

  var claims1 = new List { new Claim(ClaimTypes.Name, "Louise") , new Claim(ClaimTypes.Role, "Manager") }; ClaimsIdentity claimsIdentity1 = new ClaimsIdentity(claims1 ,"XYZ"); ClaimsPrincipal principal1 = new ClaimsPrincipal(claimsIdentity1); var claims2 = new List { new Claim(ClaimTypes.Name, "Louise") , new Claim(ClaimTypes.Role, "Employee") }; ClaimsIdentity claimsIdentity2 = new ClaimsIdentity(claims2 ,"XYZ"); ClaimsPrincipal principal2 = new ClaimsPrincipal(claimsIdentity2); 

感觉你的问题可能是一个人为的问题:

每个区域都是单独处理的,因此即使用户既是管理员又是员工,他们必须分别登录到每个区域。

推动这种分离的要求是什么? 这是问题的关键,并且可能更容易解决这个问题,而不是试图为单个用户捏造具有多个身份的可行解决方案。


要回答您的直接问题,不,您不能从委托人中删除身份。 您只能创建一个新的主体,并用您需要的任何声明集替换现有的主体。

 Thread.CurrentPrincipal = new ClaimsPrincipal(...); 

如果您从现有主体的标识或声明构建主体,则可以过滤掉要删除的主体。


基于声明的身份validation的基础是将身份validation机制与授权机制分开的想法。 您需要知道用户的身份时进行身份validation授权时 ,使用与用户关联的声明来执行访问控制决策,例如将它们放入系统的管理区域。

用户的身份应该是他们在系统环境中的身份。 在大多数系统中,用户将具有单个身份。 由于技术原因而拥有多个身份可能很有用,例如允许用户将单个身份validation与多个可更改身份相关联的系统,但如果您为每个用户拥有单一身份,通常系统最简单,因为现实是您有单个用户,通常会向您显示单个身份。

我只能想到用户登录具有多个身份的系统的一个合理原因: 用户希望使用多个身份来操作以分离他们的活动,例如工作帐户和个人帐户。

您的系统应该能够使用单个经过身份validation的身份进行操作。 如果您的经理需要通过额外的身份validation步骤才能访问管理部分,请不要尝试删除其现有身份 – 而是使用提升系统执行身份validation并将身份添加到其现有主体。 用户没有改变,您刚刚获得了更多与他们相关的声明。