c# - 如何从 ClaimsPrincipal 中删除 ClaimsIdentity

标签 c# asp.net-mvc wif claims-based-identity

我有一个在 ASP.Net MVC 中构建的 HR Web 应用程序,分为多个区域,例如经理、员工。这些区域代表系统中能够执行不同任务的不同类型的用户。涉及遗留数据库,每种用户类型的信息存储在不同的表中。此外,为每种用户类型存储的信息类型不同,因此将表分开是有意义的。

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

所以这是我的问题:是否可以通过 ClaimsPrincipal 获得多个身份?还有其他一些我忽略的技术吗?如果多个身份是可行的方法,我如何将用户从一个区域注销,但如果他们碰巧同时登录到另一个区域,又如何让他们登录到另一个区域?通常,要注销,代码如下所示:

FederatedAuthentication.SessionAuthenticationModule.SignOut();

我的假设是这会将用户从两个区域注销。这样对吗? 假设是这种情况,我想我可以简单地从 ClaimsPrincipal 中删除特定的身份,然后重置并写入 SessionSecurityToken,但是 ClaimsPrincipal 没有删除方法,只有 AddIdentity。所以我想出了以下伪代码:

退出时:

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

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

最佳答案

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

            var claims1 = new List<Claim>
            {
                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<Claim>
            {
                new Claim(ClaimTypes.Name, "Louise")
               , new Claim(ClaimTypes.Role, "Employee")
            };
            ClaimsIdentity claimsIdentity2 = new ClaimsIdentity(claims2 ,"XYZ");
            ClaimsPrincipal principal2 = new ClaimsPrincipal(claimsIdentity2);

关于c# - 如何从 ClaimsPrincipal 中删除 ClaimsIdentity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685719/

相关文章:

wif - 无法序列化 Saml2AssertionKeyIdentifierClause

c# - Perforce 命令行 : How to use -i flag in "p4 client -i"?

c# - Nuget - 对象引用未设置为对象的实例

asp.net-mvc - EF 6 和 Code First 迁移中同一数据库和应用程序中的多个数据库上下文

jquery - 使用 DataTables 时 AJAX Post 不再起作用

.net - SAAS/云 Web 应用程序和桌面应用程序之间的共享身份验证

c# - Mono 不支持 System.Runtime.Serialization.DataMemberAttribute EmitDefaultValue 设置

c# - .net/native 编码的 out string 和 StringBuilder 之间有什么区别?

c# - 如何显示流返回的 pdf(在 JsonResult 中)?

c# - 使用从 STS 分配的 token 调用 WCF 服务