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中的属性网格中).
您可以使用 GenericIdentity 作为 Identity 的具体实现,您可以在其中以编程方式自行提供有关当前用户的详细信息。如果您自己通过其他渠道识别并验证了用户,那就太好了。
| 归档时间: |
|
| 查看次数: |
18895 次 |
| 最近记录: |