认证、授权、用户和管理的作用和一般的安全。净
-
11-07-2019 - |
题
我需要知道如何去关于执行大安全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服务器。
现在,对于授权(即告诉你用什么样的登录用户是允许这样做),这是一个简单的问题查询的广告用于清单的团体的登录用户是会员。然后检查的适当组的名称和建立用户界面为基础的成员这种方式。
我应用程序的工作都是这样的:
- 启动应用程序,凭证是根据登录用户,这是本主要方面的认证(即他们可以登录在因此他们的存在)
- 我得到的所有群体的窗户身份的问题
- 我检查为标准的用户集团--如果这个小组不存在适用于Windows的身份在问题,然后是认证失败
- 我检查管理员用户集团--与现有用户集团,我修改UI允许访问行政部件
- 显示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。他/她可以创建活动限制通过用户界面。
你还可以检查这篇文章具有更多了解关于权限和角色为基础的系统。