是否可以在ASP.NET中拥有多个Principal?

时间:2015-09-29 12:58:48

标签: c# asp.net session principal

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

2 个答案:

答案 0 :(得分:2)

DVK的答案是有效的,但过去使用自定义object GeometryObjectLeafFormats extends DefaultJsonProtocol{ implicit val geometryObjectsTypeFormat = GeometryObjectsTypeFormat implicit val polygonFormat = jsonFormat2(Polygon) implicit val pointFormat = jsonFormat2(Point) } object GeometryObjectFormat extends JsonFormat[GeometryObject] { import GeometryObjectLeafFormats._ override def read(json: JsValue): GeometryObject = json match { case known:JsObject if known.fields.contains("type") => known.fields.get("type").get match{ case JsString(PointType.value) => pointFormat.read(known) case JsString(PolygonType.value) => polygonFormat.read(known) case unknown => deserializationError(s"unknown GeometryObject: ${unknown}") } case unknown => deserializationError(s"unknown GeometryObject: ${unknown}") } override def write(obj: GeometryObject): JsValue = obj match { case x:Point => pointFormat.write(x) case x:Polygon=> polygonFormat.write(x) case unrecognized => serializationError(s"Serialization problem ${unrecognized}") } } 时我遇到了一些问题。另一种方法是使用由IPrincipal表示的单个主体,并利用它可以存储多个身份的事实。然后,您可以使用ClaimsPrincipal的默认实现。

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

答案 1 :(得分: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