什么是通用身份?
Posted
技术标签:
【中文标题】什么是通用身份?【英文标题】:What is GenericIdentity? 【发布时间】:2010-10-23 13:32:32 【问题描述】:谁能简要解释一下 GenericIdentity 的用途和使用地点。
【问题讨论】:
请用示例c#解释一下 【参考方案1】:GenericIdentity 类可以与 GenericPrincipal 类结合使用,以创建独立于 Windows 域而存在的授权方案。
GenericIdentity myIdentity = new GenericIdentity("MyUser");
【讨论】:
【参考方案2】:GenericIdentity 类:- GenericIdentity 类实现 IIdentity 接口。它表示基于应用程序定义的自定义身份验证方法的用户身份。 GenericPrincipal 类:- GenericPrincipal 类实现 IPrincipal 接口。它表示独立于 Windows 用户及其角色而存在的用户和角色。本质上,通用主体是应用程序身份验证和授权的简单解决方案。
【讨论】:
【参考方案3】:GenericIdentity
和GenericPrincipal
是将用户描述为“委托人”的最简单方式。这可用于应用程序中的实现不感知安全检查 - 即,如果用户以“Fred”身份登录并具有“用户”和“管理员”权限:
string[] roles = "User", "Admin" ;
Thread.CurrentPrincipal = new GenericPrincipal(
new GenericIdentity("Fred"), roles);
您可以在客户端登录到 winform 时执行此操作,或者在 WCF、ASP.NET 等中执行此操作的特定点。
随后的代码,无需知道如何处理这些权限,就可以检查该权限 - 通过IsInRole,或以声明方式:
[PrincipalPermission(SecurityAction.Demand, Role = "Admin")]
void SomeAdminFunction()
这里一些有用的实用程序代码是围绕主体/身份的空安全包装器:
public static string GetUsername()
IPrincipal principal = Thread.CurrentPrincipal;
IIdentity identity = principal == null ? null : principal.Identity;
return identity == null ? null : identity.Name;
public static bool IsInRole(string role)
IPrincipal principal = Thread.CurrentPrincipal;
return principal == null ? false : principal.IsInRole(role);
那么你的 DAL 中可能有一些审计代码:
row.UpdatedBy = MyUtilityClass.GetUsername();
GenericPrincipal
对于普通用户名和一组已知角色的简单情况很有用。
例如,更复杂的主体实现可能会进行“按需”访问检查 - 即直到您要求它不知道的“Foo”角色 - 然后它会发现(通过与 Web 服务、数据库、活动 -目录等)并缓存结果以供将来访问。这在潜在角色列表很大且现实中通常查询的角色数量很少时很有用。
您还可以使用主体来存储仅在某些上下文中需要的额外身份信息 - 例如,安全令牌。调用者可能会使用as
测试主体以查看它是否支持额外数据。
使用“主体”很有用,因为您的逻辑处理代码可以谈论身份,而不必知道这是否是 winforms、ASP.NET、WCF、Windows 服务等 - 它是抽象的。此外,一些第 3 方代码也会与委托人对话。
作为另一个例子——我写了一些example code here,它展示了如何使用主体来控制通过设计器对winform控件的访问(通过IExtenderProvider
——它将额外的条目放入VS的属性网格中)。
【讨论】:
PrincipalPermission 属性如何工作?如果调用方法时 Thread.CurrentPrincipal 不包含正确的角色,会引发异常吗? @Svish - 完全是 (SecurityException
);它是运行时直接作用的(少数)属性之一。【参考方案4】:
看看
http://msdn.microsoft.com/en-us/library/system.security.principal.genericidentity.aspx
您会在上面找到一些示例。它代表一个普通用户。
身份验证和配置文件权限。
【讨论】:
【参考方案5】:您可以将 GenericIdentity 用作 Identity 的具体实现,您希望自己以编程方式提供有关当前用户的详细信息。如果您自己通过其他渠道识别并验证了用户,那就太好了。
【讨论】:
我正在尝试这样做,但无法以编程方式在我的一个继承自GenericIdentity
的类上设置 .IsAuthenticated
属性。我收到错误消息:Property or indexer 'System.Security.Claims.ClaimsIdentity.IsAuthenticated' cannot be assigned to -- it is read only
有什么想法吗?
我最终通过让我的类实现 IIdentity
来解决这个问题,并提供了我自己对这些属性的实现。以上是关于什么是通用身份?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Vaadin 应用程序的通用访问卡 (CAC) 身份验证