将用户存储在IPrincipal / IIdentity中有什么好处?

时间:2014-09-13 11:40:48

标签: c#

什么是IPrincipal / IIdentity优势,而不是拥有包含您需要的属性并将其用于身份验证/授权的自定义User类?

2 个答案:

答案 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 / GenericPrincipalFormsIdentity使用SessionAuthenticationModule / ClaimsPrincipal。相反,您的自定义模块可以使用您想要的任何自定义实现。

答案 1 :(得分:2)

Active Directory,Windows Identity Foundation和Windows本身等标准身份验证方法都使用IPrincipalIIdentity。基本上,如果要使用任何内置身份验证机制,则必须使用这些类。通常,您将拥有用于存储用户信息的自定义数据库架构,并且您将从该数据创建IPrincipalIIdentity个对象以进行身份​​验证。