什么是IPrincipal / IIdentity优势,而不是拥有包含您需要的属性并将其用于身份验证/授权的自定义User类?
答案 0 :(得分:3)
明显的好处如下:应用程序认证的整个概念&授权是围绕以IPrincipal
/ IIdentity
表示的主体和身份构建的。因此,内置机制通常假设使用这两种机制。如果使用它们,内置机制可以工作。
以Web应用程序为例。请求生命周期中HttpContext
的用户表示为IPrincipal
。通过遵循此约定,您可以允许授权机制正确评估是否允许用户访问Web资源。这是因为WebForms UrlAuthorization
的模块和MVC的Authorization
属性都假设主体以这种标准方式存储。
在桌面应用程序中,您Thread
的{{1}}也是CurrentPrincipal
。
使用您自己的身份验证/授权接口替换IPrincipal
/ IPrincipal
将需要永远。您必须重写处理身份验证/授权的基类库的大多数部分,而不是依赖于自定义实现的内置接口。
但是,我并不认为你提出的两个陈述之间存在任何对立。您询问了IIdentity
相对于自定义类的优势。但 IPrincipal
只是一个界面(!!),您的自定义类可以轻松实现它。与IPrincipal
相同。然后,您可以将自定义类放在期望IIdentity
的任何位置。
当然,这可能有点棘手,例如在Web应用程序中,您必须替换设置IPrincipal
的内置身份验证模块。最常用的有两个 - IPrincipal
使用FormsAuthenticaiton
/ GenericPrincipal
和FormsIdentity
使用SessionAuthenticationModule
/ ClaimsPrincipal
。相反,您的自定义模块可以使用您想要的任何自定义实现。
答案 1 :(得分:2)
Active Directory,Windows Identity Foundation和Windows本身等标准身份验证方法都使用IPrincipal
和IIdentity
。基本上,如果要使用任何内置身份验证机制,则必须使用这些类。通常,您将拥有用于存储用户信息的自定义数据库架构,并且您将从该数据创建IPrincipal
和IIdentity
个对象以进行身份验证。