【问题标题】:Is it possible to have more than one Principal in ASP.NET?ASP.NET 中是否可以有多个 Principal?
【发布时间】:2023-04-05 17:32:02
【问题描述】:

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

【问题讨论】:

  • “单独登录”是什么意思? “我覆盖了我的正常登录”是什么意思?
  • 您的意思是希望您的应用程序允许,例如,基于声明和基于表单的身份验证?
  • 您根本不应该更改线程原理,将您的身份验证信息存储在会话对象或 cookie 中。如果您希望它更安全,请仅存储加密的身份验证密钥并在数据库或其他数据存储中查找经过身份验证的用户的原则。 ASP.net 具有您应该尝试使用的内置身份验证提供程序。
  • “单独登录”是指某些控制器可以通过第一种登录类型访问,而其他控制器可以通过我的自定义登录类型访问。登录是使用不同的用户凭据(密码、密码、...)和不同的形式完成的。通过覆盖我的正常登录,我的意思是,如果我以普通用户身份登录,然后通过我的自定义登录登录 Thread.Principle 将被我的自定义原则覆盖,因此主登录不再有效。所以我可以假设现有的使用 Thread.Principle 登录是不好的做法,我应该尝试使用会话或 cookie 来实现我的身份验证?
  • @RonBeyer 更改 Thread 主体是一种非常常见且有效的做法,例如在使用自定义安全主体对象时。将身份验证信息存储在 Session 或 cookie 中不会使其对底层提供者可用。它只是允许在页面之间持久化它。

标签: c# asp.net session principal


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我创建了 CustomPrinciple 来保存我的两个 IPrinciple 对象。我在让它正常工作方面遇到了一些问题,但它现在似乎正在工作。感谢您@DVK 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多