1

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

4

2 回答 2

2

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

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

于 2015-09-29T13:44:57.660 回答
1

这是非常可行的,而且不是很困难。我发现做到这一点的最好方法是实现一个自定义 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.Current 主体。

有很多细节的好资源: ASP.NET MVC - Set custom IIdentity or IPrincipal

于 2015-09-29T13:33:41.863 回答