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