因为IPriincipal具有IIdentity属性,所以在我的User类上实现这两个接口都很好吗?
通常,用户和用户交互的安全上下文是不同的东西,因此如果以通用方式建模,这些应该像IPrincipal和IIdentity接口那样分开.(您可以想象同一用户可以使用不同角色与系统交互的应用程序.)
有两个概念相同的应用程序,在这种情况下,我认为您可以安全地使用单个类实现两个接口.如果不通过IPrincial和IIdentity接口直接将实现类公开给应用程序逻辑,则尤其如此.如果你保持这种分离,你可以随时重构你的课程,而不会破坏应用程序逻辑.
您应该记住的另一个方面:通常为用户设置安全上下文比设置身份(您需要获取权限等)更昂贵.但是在某些情况下,应用程序只是指用户,但不需要具有正确配置的安全上下文.在这些情况下,初始化用作身份和主体的用户类实例可能是性能问题.(当然,您也可以通过其他技术来解决这个问题,而不仅仅是通过拆分类来解决这个问题.)
最后,您还应该考虑,是否要使用自己的用户类实现IIdentity/IPrincipal,或者只是填充GenericPrincipal/GenericIdentity实例.这里最重要的事实是,IPrincipal(和IIdentity)实例必须是可序列化的,因为它们可能会转到其他AppDomains.设置一个可以在AppDomains中轻松序列化和反序列化的IPrincipal实现并不容易,需要格外小心.因此,除非您需要特殊的角色检查,否则我建议使用GenericPrincipal/GenericIdentity.(详见:http://sontek.vox.com/library/post/re-iprincipal-iidentity-ihttpmodule-serializable.html)