我需要知道如何去关于执行大安全C#应用程序。什么选择我们在这方面?我更愿意使用现有框架,如果它符合我的要求-我不要重新发明轮子。

我要求如下:

  • 通常的用户名/密码认证
  • 管理的用户分配权限的用户
  • 管理角色的用户分配角色,分配权限的角色
  • 授权的用户根据自己的用户名和作用

我在寻找一个自由/开放源框架/图书馆已经时间tesed和使用。净的社区。

我应用程序需要一个客户/服务器的方法,用服务器运行为windows服务,将其连接到SQL服务器数据库。之间的通信的客户和服务将通过WCF。

另一件事是很重要的是,我需要能够指定特定用户或用户的角色的权限查看/Update/Delete一个具体的实体,无论它是一个客户,或产品等。例如杰克可以查看一定3的10客户,但仅更新详细的客户微软雅虎、谷歌,而只能删除。

有帮助吗?

解决方案

为粗粒度的安全,你可能会找到内在的主要码有用的;用户对象(及其作用)是控制。净由"主要",但是有益的运行时本身可以执行这一点。

执行情况的一个主体可以执行定义,并且通常可以注入您自己; 例如在WCF.

看运行时强制实施粗入(即哪 功能 可以访问,但不限于哪些特定的 数据):

static class Roles {
    public const string Administrator = "ADMIN";
}
static class Program {
    static void Main() {
        Thread.CurrentPrincipal = new GenericPrincipal(
            new GenericIdentity("Fred"), new string[] { Roles.Administrator });
        DeleteDatabase(); // fine
        Thread.CurrentPrincipal = new GenericPrincipal(
            new GenericIdentity("Barney"), new string[] { });
        DeleteDatabase(); // boom
    }

    [PrincipalPermission(SecurityAction.Demand, Role = Roles.Administrator)]
    public static void DeleteDatabase()
    {
        Console.WriteLine(
            Thread.CurrentPrincipal.Identity.Name + " has deleted the database...");
    }
}

然而,这并不能帮助与精细的访问(即"弗雷德可以访问的客户,但不客户B")。


另外;当然,对现实,你可以简单地检查所需的角色在运行时,通过检查 IsInRole 在主要负责人:

static void EnforceRole(string role)
{
    if (string.IsNullOrEmpty(role)) { return; } // assume anon OK
    IPrincipal principal = Thread.CurrentPrincipal;
    if (principal == null || !principal.IsInRole(role))
    {
        throw new SecurityException("Access denied to role: " + role);
    }
}
public static User GetUser(string id)
{
    User user = Repository.GetUser(id);
    EnforceRole(user.AccessRole);
    return user;
}

你也可以写你自己的主体/对象的身份,懒做的测试/缓存的角色,而不必认识他们所有的前:

class CustomPrincipal : IPrincipal, IIdentity
{
    private string cn;
    public CustomPrincipal(string cn)
    {
        if (string.IsNullOrEmpty(cn)) throw new ArgumentNullException("cn");
        this.cn = cn;
    }
    // perhaps not ideal, but serves as an example
    readonly Dictionary<string, bool> roleCache =
        new Dictionary<string, bool>();
    public override string ToString() { return cn; }
    bool IIdentity.IsAuthenticated { get { return true; } }
    string IIdentity.AuthenticationType { get { return "iris scan"; } }
    string IIdentity.Name { get { return cn; } }
    IIdentity IPrincipal.Identity { get { return this; } }

    bool IPrincipal.IsInRole(string role)
    {
        if (string.IsNullOrEmpty(role)) return true; // assume anon OK
        lock (roleCache)
        {
            bool value;
            if (!roleCache.TryGetValue(role, out value)) {
                value = RoleHasAccess(cn, role);
                roleCache.Add(role, value);
            }
            return value;
        }
    }
    private static bool RoleHasAccess(string cn, string role)
    {
        //TODO: talk to your own security store
    }
}

其他提示

看看 ASP.NET's成员提供者.我不认为出框(它将在你的情况下工作,但它很容易滚你自己的供应商。

我的回答可能是依赖这个问题的答案: 这是一种企业应用程序,它生活在一个网络活动的目录?

如果答案是肯定的,那么这些步骤的我会提供:

1)造成全球集团,在我的情况下,我有一个为appuser团和APPADMIN组。

2)有你SQL服务器可在混合认证模式,然后指定你为appuser组(s)作为SQL服务器登录到数据库中有适当的污物权数据库(s),并确保访问SQL服务器 可信的连接=True 在你连串。

在这一点上,你的广告商将负责认证。因为,你在访问应用程序通过一个可信的连接,它将通过身份的任何帐户运行的应用到SQL服务器。

现在,对于授权(即告诉你用什么样的登录用户是允许这样做),这是一个简单的问题查询的广告用于清单的团体的登录用户是会员。然后检查的适当组的名称和建立用户界面为基础的成员这种方式。

我应用程序的工作都是这样的:

  1. 启动应用程序,凭证是根据登录用户,这是本主要方面的认证(即他们可以登录在因此他们的存在)
  2. 我得到的所有群体的窗户身份的问题
  3. 我检查为标准的用户集团--如果这个小组不存在适用于Windows的身份在问题,然后是认证失败
  4. 我检查管理员用户集团--与现有用户集团,我修改UI允许访问行政部件
  5. 显示UI

然后,我有一个原则,目的与确定权等在这,我利用全球变量,我可以访问,以确定适当的UI,同时建立我的形式(即如果我的用户不是一个部件的管理集团,然后,我会隐藏的所有删除按钮).

为什么我建议这?

这是一个问题的部署。

它一直是我的经验,大多数企业应用程序的部署通过网络工程师,而不是程序员--因此,具有认证/授权的责任的广告意义,因为这是该网络的家伙走了当你讨论认证/授权。

此外,在创造新的用户为网络,网络工程师(或无论是谁负责创建新的网络用户)更容易记得,执行集团的任务,而他们在广告比事实上,他们已经走到一个十几个应用程序来分析任务的授权。

这样做有助于迷宫的权限和权利,新的招聘需要给予或那些离开公司,需要加以否认并保持身份验证和授权的中央储存库属于它的地方(即在广告@域控制器上等级)。

我会看看的东西喜欢CSLA.net: 专家C#2008年业务的对象

它应该提供一切你需要的。

WCF有丰富的安全有关的功能提供了这两个授权和验证。在详细信息:http://msdn.microsoft.com/en-us/library/ms735093.aspx

我认为你看几个单独的问题在这里--这不是偶然的大部分安全系统的独立身份验证和授权。

为认证,更大的问题是后勤的.或者,是否有一个合乎逻辑的地方为这些用户生活,在本地的应用程序,在活动目录,其他一些LDAP储存或甚至在其他一些应用程序。正是在那里是很不重要的--我们只需要能够坚实地确定用户和最好使这项任务的其他人的问题。一天结束的时候,你真的只是需要一个独特的标识符和安慰的是,鲍勃从会计实际上是鲍勃从会计。

授权是更有趣的问题的一部分在这里。我认为,如果这真是细粒的,你真的想要管理这个全部应用程序内,无论身在何处的用户。Marc Gravell真的打上一个很好的方式来模式至少在一些这方面的--使用的一些定义的执行情况的IPrincipal和PrincipalPermission管理的事情是一个非常干净的方式开始。除此之外,你可以使用的技术一样 这一个 要使更为复杂的授权决定在一个比较清洁的方式。

我会用这个词-'来说'(基于角色的出入控制系统)作为解决你所有的要求。

我不会去详细说明'来说'在这里,我将简要地描述为:

它基本上包含3个特征。

1)验证它确认用户的身份。它通常是通过用户的帐户和密码,或凭证。

2)授权--它规定了什么样的用户可以做到和不能做一个应用程序。前。'修改为'是允许的,但'创造新秩序'并不容许的。

3)审计的用户操作上的应用。-这跟踪用户的操作应用、以及谁授予其的访问其中的用户?

你可以检查来说,在wiki在这里。

https://en.wikipedia.org/wiki/Role-based_access_control

现在,关于回答你的要求的一个可能的解决办法是延长ASP.NET 成员按您的需求。

关于一些准备使用的框架,我建议 VisualGuard 为我工作,你应该看看这个,它不所有的东西你需要什么非常容易地,以及什么是最重要的是,管理所有用户、角色、权限,和应用经由中央管理控制台,并用于限定的权限,管理员不需要开发人员的知识,i。他/她可以创建活动限制通过用户界面。

你还可以检查这篇文章具有更多了解关于权限和角色为基础的系统。

http://www.visual-guard.com/EN/net-powerbuilder-application-security-authentication-permission-access-control-rbac-articles/dotnet-security-article-ressources/role-based-access-control-source_soforum.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top