什么是通用身份?

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】:

GenericIdentityGenericPrincipal 是将用户描述为“委托人”的最简单方式。这可用于应用程序中的实现不感知安全检查 - 即,如果用户以“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) 身份验证

js判断身份证号码是不是合法有效全国通用

Django 基于类的通用视图和身份验证

.Net Core 使用通用第三方用户存储/api 进行身份验证

如何在 laravel 5.8 或 6 中制作通用自定义包进行身份验证。*