2014-09-13 51 views
0

什么是IPrincipal/IIdentity优势,而不是拥有包含您需要的属性的自定义User类并将其用于认证/授权?将用户存储在IPrincipal/IIdentity中有什么好处?

+0

它们是接口,你不在接口中“存储用户”。它们具有通常的接口优点,即与特定实现无关的合同。让你的班级实施这些界面是否有用是有点令人怀疑的,但是不清楚这个问题。 – 2014-09-13 12:48:51

回答

3

显而易见的好处如下:应用程序的身份验证&授权的整体概念是围绕以下方式构建的:主体和身份,表示为IPrincipal/IIdentity。正因为如此,内置机制通常假定使用这两种机制。如果他们被使用,建立在机制可以工作。

以Web应用程序为例。 HttpContext的终身用户申请表示为IPrincipal。通过符合这个约定,您允许授权机制正确地评估用户是否被允许访问网络资源。这是因为WebForms UrlAuthorization的模块和MVC的Authorization属性都假定主体以此标准方式存储。

在桌面应用程序中,您有ThreadCurrentPrincipal这也是IPrincipal

更换IPrincipal/IIdentity与您自己的认证/授权接口将永远。您将不得不重写基本类库的大部分处理认证/授权的部分,而不是内置在您要依靠自定义实现的接口中。

但是,我不完全明白你提出的两个陈述之间的任何反对意见。您询问了IPrincipal优于自定义课程的优势。但是IPrincipal只是一个接口(!!),您的自定义类可以轻松实现。与IIdentity相同。然后,您可以将您的自定义课程放在任何地方IPrincipal预计。

当然,这可能有点棘手,例如在Web应用程序中,您将不得不替换内置的验证模块来设置IPrincipal。最常用的有两种 - FormsAuthenticaiton,它使用GenericPrincipal/FormsIdentitySessionAuthenticationModule,它使用ClaimsPrincipal/ClaimsIdentity。相比之下,您的自定义模块可以使用您想要的任

+0

“在桌面应用程序中,您有Thread的CurrentPrincipal” - 也是在服务器应用程序中。 – Joe 2014-09-13 13:00:18

+0

@Joe:true。我只想举一些例子,而不是全部。 – 2014-09-13 14:14:16

2

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