2008-11-21 35 views

回答

6

通常,用户和用户交互的安全上下文是不同的事情,因此如果以通用方式建模,这些应该与IPrincipal和IIdentity接口一样分离。 (你可以想象应用程序中同一个用户可以有不同的角色来与系统进行交互)。

有两个概念相同的应用程序,在这种情况下,我认为你可以安全地使用一个类实现两个接口。如果您不直接通过IPrincial和IIdentity接口将实现类直接暴露给应用程序逻辑,那么尤其如此。如果你保持这种分离,你可以随时重构你的类,而不会破坏应用程序逻辑。

你应该记住另一个方面:通常设置为用户的安全上下文,而不是建立一个身份(你需要获取权限等)更昂贵。但是,在某些情况下,应用程序只是指用户,但不需要具有正确配置的安全上下文。在这些情况下,初始化用作身份和主体的用户类实例可能是性能问题。 (当然,你也可以通过其他技术来解决这个问题,不仅仅是分开课程)。

最后,你还应该考虑,无论你是想用你自己的用户类来实现IIdentity/IPrincipal,还是只想填充GenericPrincipal/GenericIdentity实例。这里最重要的事实是,IPrincipal(和IIdentity)实例必须是可序列化的,因为它们可能会转到其他AppDomains。设置一个可在AppDomain中轻松序列化和反序列化的IPrincipal实现并非易事,需要特别小心。所以除非你需要特殊的角色检查,否则我会推荐使用GenericPrincipal/GenericIdentity。 (详见这里:http://sontek.vox.com/library/post/re-iprincipal-iidentity-ihttpmodule-serializable.html