ASP.NET 是否可以有多个 Principal?
Is it possible to have more than one Principal in ASP.NET?
我最近接到一项任务,要为属于特定角色的用户创建单独的登录名。已经为主要用户实现了登录,这是通过使用分配给 Thread.CurrentPrincipal
的 Principal 完成的,之后每次加载页面时都会检查其值。我修改了我的代码以使用相同的身份验证机制,因此在我的自定义登录中我创建了自定义主体并将其分配给 Thread.CurrentPrincipal
。现在的问题是,使用自定义登录我会覆盖我的正常登录,反之亦然。是否可以将我的原则分配到 Thread.CurrentPrincipal
以外的其他地方以允许两种登录变体同时工作?如果这不可能,我想了解替代方案:)
这是非常可行的,而且不是很困难。我发现执行此操作的最佳方法是实现具有 属性 且还包含 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
DVK 的回答是有效的,但我过去在使用自定义 IPrincipal
时遇到过麻烦。另一种方法是使用单个主体,由 ClaimsPrincipal
表示,并利用它可以存储多个身份的事实。例如,您可以使用 IsInRole
的默认实现。
https://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal(v=vs.110).aspx
我最近接到一项任务,要为属于特定角色的用户创建单独的登录名。已经为主要用户实现了登录,这是通过使用分配给 Thread.CurrentPrincipal
的 Principal 完成的,之后每次加载页面时都会检查其值。我修改了我的代码以使用相同的身份验证机制,因此在我的自定义登录中我创建了自定义主体并将其分配给 Thread.CurrentPrincipal
。现在的问题是,使用自定义登录我会覆盖我的正常登录,反之亦然。是否可以将我的原则分配到 Thread.CurrentPrincipal
以外的其他地方以允许两种登录变体同时工作?如果这不可能,我想了解替代方案:)
这是非常可行的,而且不是很困难。我发现执行此操作的最佳方法是实现具有 属性 且还包含 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
DVK 的回答是有效的,但我过去在使用自定义 IPrincipal
时遇到过麻烦。另一种方法是使用单个主体,由 ClaimsPrincipal
表示,并利用它可以存储多个身份的事实。例如,您可以使用 IsInRole
的默认实现。
https://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal(v=vs.110).aspx