【问题标题】:C# Role-based securityC# 基于角色的安全性
【发布时间】:2011-05-12 15:31:24
【问题描述】:

我有一个包含我的数据库访问层的类库,我在所有与该数据库一起使用的项目中都使用它,现在我想在这个库中集成安全性,以便我可以为不同的安全角色返回不同的数据。使用 .NET 内置安全性实现这一目标的最佳方法是什么? 我正在考虑使用 System.Security.Permissions.PrincipalPermission 但我看不出它如何帮助我,因为使用我的库的任何人都可以编写这样的客户端应用程序

GenericIdentity genericIdentity = new GenericIdentity("User");
GenericPrincipal genericPrincipal = new GenericPrincipal(genericIdentity, new[] { "Administrator" });
Thread.CurrentPrincipal = genericPrincipal;

他们将通过我所有的主要许可要求

PrincipalPermission principalPermission = new PrincipalPermission(null, "Administrator");
principalPermission.Demand();

甚至没有进行身份验证。 要么我不了解这种安全模型,要么它根本不保护任何东西。

【问题讨论】:

  • 2 年后阅读我自己的问题,多么愚蠢的问题 -)

标签: c# .net security


【解决方案1】:

基于角色的安全性旨在作为库代码使用客户端选择的安全模型而无需了解实现的一种方式;这里的关键是您已经可以合理地信任客户端的安全模型,并且您只想根据客户端做出的决定(例如作为登录过程的一部分)提供适当的选项。

如果您信任客户,那么所有的赌注都无论如何,因为他们可以使用反射将您的内部结构撕成碎片。在这种情况下,最好将该实现代码保密,例如通过以某种方式接受用户凭据的 Web 服务。那么他们只能是他们拥有凭据的帐户。

【讨论】:

  • 你是对的,实际上软件客户端(使用这个库的应用程序)是受信任的,我自己写的,但是我有很多这个库(服务)的前端,比如 WEB、WCF、桌面,我希望我的所有身份验证都在这个库中。
  • @BrokenPipe - 那么也许您可以单独断言权限必须是给定的具体实现? (与is)? (只有你的代码可以发出)
  • 您是否针对一个安全存储(如 Active Directory)验证所有内容?...或同时针对 AD 和 SQL Server 进行验证?
  • 我正在使用 SQL server db 进行身份验证。
  • “那么也许你可以单独断言权限必须是给定的具体实现”是的,在这种情况下,我可以使用一些智能 IsAuthenticated 属性实现创建我的自定义 IIdentity,但我想它会是很丑。
【解决方案2】:
public class Example
{

  // Will enforce that the user have the administrator role
  [PrincipalPermission(XXXX, Role="Administrator")]
  public void Remove(int userId)
  {
  }

  public void Add(int userId)
  {
     if (!Thread.CurrentPrincipal.IsInRole("User"))
        throw new UnauthorizedAccessException("Only registered users may add users");
  }

}

如何设置实际的主体/身份配置取决于您的库的用户。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2012-03-18
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多