编程语言
首页 > 编程语言> > c# – 如何从ClaimsPrincipal中删除ClaimsIdentity

c# – 如何从ClaimsPrincipal中删除ClaimsIdentity

作者:互联网

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

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

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

FederatedAuthentication.SessionAuthenticationModule.SignOut();

我的假设是,这将使用户退出这两个区域.它是否正确?
假设是这种情况,我想我可以简单地从ClaimsPrincipal中删除特定的Identity,然后重置并编写SessionSecurityToken,但ClaimsPrincipal没有remove方法,只有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,asp-net-mvc,wif,claims-based-identity
来源: https://codeday.me/bug/20190624/1278108.html