在ASP.NET中是否可能有多个主体?

本文关键字:主体 可能有 是否 ASP NET | 更新日期: 2023-09-27 18:14:57

我最近得到了一个任务,为属于某个角色的用户创建单独的登录。已经为主要用户实现了登录,这是通过使用分配给Thread.CurrentPrincipal的Principal来完成的,并且在每次加载页面时检查其值。我修改了我的代码以使用相同的身份验证机制,因此在我的自定义登录中,我创建了自定义主体并将其分配给Thread.CurrentPrincipal。现在的问题是,自定义登录我覆盖我的正常登录,反之亦然。是否有可能将我的原则分配到Thread.CurrentPrincipal以外的地方,以允许两种登录变体同时工作?如果这是不可能的,我想了解替代方案:)

在ASP.NET中是否可能有多个主体?

DVK的答案是有效的,但是我在过去使用自定义IPrincipal时遇到了一些问题。另一种方法是使用单个主体,由ClaimsPrincipal表示,并利用它可以存储多个身份的事实。例如,您可以使用IsInRole的默认实现。

https://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal (v = vs.110) . aspx

这是非常可行的,并不是非常困难。我发现这样做的最好方法是实现一个自定义IPrincipal,它的属性也包含一个IPrincipal。然后,您可以将两者存储在线程中,并以允许检查两个主体对象以进行授权的方式实现IsInRole方法。一些伪代码…

public class MyPrincipal : IPrincipal
{
    public IPrincipal FormsPrincipal { get; private set; }
    public MyPrincipal(IPrincipal formsPrincipal)
    {
        FormsPrincipal = formsPrincipal;
    }
    public bool IsInRole(string role)
    {
        if (someCondition)
        {
            // check roles for this
        }
        else
        {
            return FormsPrincipal.IsInRole(role); // check role against the other principal
        }
    }
}

然后在PostAuthenticateRequest中,使用当前主体来创建新的自定义主体,并将自定义主体分配为HttpContext。当前主要。

有很多细节的好资源:ASP。. NET MVC -设置自定义IIdentity或IPrincipal