什么是GenericIdentity?

vin*_*eth 24 c# asp.net authentication

任何人都可以简单地解释一下GenericIdentity的用途以及在哪里使用它.

Mar*_*ell 48

GenericIdentity并且GenericPrincipal是将用户描述为"主体"的最简单方式.这可用于在应用程序中实现不知情的安全检查 - 即,如果用户使用"用户"和"管理员"权限登录为"Fred":

    string[] roles = { "User", "Admin" };
    Thread.CurrentPrincipal = new GenericPrincipal(
        new GenericIdentity("Fred"), roles);
Run Code Online (Sandbox Code Playgroud)

您可以在客户端登录winform时执行此操作,或者在WCF,ASP.NET等中有特定点可以执行此操作.

然后,稍后的代码,无需知道如何处理这些权限,可以通过IsInRole或声明性地检查该权限:

[PrincipalPermission(SecurityAction.Demand, Role = "Admin")]
void SomeAdminFunction() { }
Run Code Online (Sandbox Code Playgroud)

这里一些有用的实用程序代码是关于委托人/身份的空安全包装:

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);
}
Run Code Online (Sandbox Code Playgroud)

那么您可能在DAL中有一些审计代码:

row.UpdatedBy = MyUtilityClass.GetUsername();
Run Code Online (Sandbox Code Playgroud)

GenericPrincipal对于普通用户名和一组已知角色的简单情况很有用.例如,更复杂的主要实现可以执行"按需"访问检查 - 即直到您要求它不知道的"Foo"角色 - 然后它发现(通过与Web服务,数据库交谈,活动 - 目录等)并缓存结果以供将来访问.当潜在角色列表很大并且实际上通常查询的角色数量很少时,这很有用.

您还可以使用主体来存储仅在某些上下文中需要的额外身份信息 - 例如,安全令牌.调用者可以测试主体as以查看它是否支持额外数据.

使用"principal"很有用,因为你的逻辑处理代码可以谈论身份,而不必知道这是winforms,ASP.NET,WCF,Windows服务等 - 它是抽象的.此外,一些第三方代码也将与校长交谈.

作为另一个例子 - 我在这里编写了一些示例代码,演示了如何使用principal通过设计器控制对winform控件的访问(通过IExtenderProvider- 将额外的条目放入VS中的属性网格中).


Ale*_*lli 3

您可以使用 GenericIdentity 作为 Identity 的具体实现,您可以在其中以编程方式自行提供有关当前用户的详细信息。如果您自己通过其他渠道识别并验证了用户,那就太好了。

  • 我正在尝试执行此操作,但无法以编程方式在继承自“GenericIdentity”的类上设置“.IsAuthenticated”属性。我收到错误:“属性或索引器‘System.Security.Claims.ClaimsIdentity.IsAuthenticated’无法分配给——它是只读的”有什么想法吗? (2认同)
  • 我最终通过让我的类实现“IIdentity”并提供我自己的这些属性的实现来解决这个问题。 (2认同)