我一直试图“在字里行间”阅读NetSqlAzMan项目的原始(和/或当前)动机。
这是写给你的吗?
.
我喜欢NetSqlAzMan的对象模型。但是我需要为我的项目经理和其他开发人员使用它的任何决定辩护。就我所希望的安全性而言,对象模型似乎“恰到好处”(想想金凤花和中间层)。我不想做基于角色的安全。我想要正确(或任务或许可)的安全性。
(见:http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/和http://granadacoder.wordpress.com/2010/12/01/rant-hard-coded-security-roles/ )
基本上,提出的问题是:“使用NetSqlAzMan而不是((AzMan))有什么好处?”
子问题是“(AzMan)死了吗?”(还有一些类似于NetSqlAzMan万岁的东西!)
..
我的一般要求是:
非活动目录用户。(接下来,Active和/或LDAP支持将是不错的,但不是一个要求)。密码不以纯文本形式存储。能够处理安全检查的权限。
将任何角色下的权利分组。为用户分配角色。(但同样,代码将检查右侧,而不是执行操作时的角色。)允许(有时)将权利分配给用户。有一个拒绝覆盖。(也就是,一个做傻事的用户(比如“删除雇员”)可以被撤销这个权利。)可以为多个应用程序维护角色和权限。
所以其他的想法是受欢迎的。但Windows标识基金会似乎有点过火了。
谢谢。
发布于 2012-01-06 14:54:12
昨晚我终于找到了一篇“比较”文章。
http://www.c-sharpcorner.com/uploadfile/a.ferendeles/netsqlazman12122006123316pm/netsqlazman.aspx
我将在这里粘贴相关的部分(如下)。(以防该网站在未来不再存在。很小的机会,我知道,但我讨厌“答案在这里”的链接,当你点击链接,它是一个死的。
据我所知。
NetSqlAzMan提供了一个(表)用户定义的函数,您可以重载它来提供用户列表(分配给角色/任务)。NetSqlAzMan不仅提供了“你可以”映射(Grant),而且还提供了拒绝和授权-带-代理。NetSqlAzMan和Azman允许用户(组)进行角色映射。只有NetSqlAzMan允许用户执行任务映射。
看了几个样本后..。NetSqlAzMan的对象模型非常清晰。
=======================================================
Ms授权管理器(AzMan)与.NET Sql授权管理器(NetSqlAzMan) 如前所述,类似的Microsoft产品已经存在,名为授权管理器( AzMan );默认情况下,AzMan存在于Windows 2003中,并且通过管理包设置出现在Windows中。 AzMan和NetSqlAzMan的重要区别在于,第一种是基于角色的,即基于每个角色中的归属-角色概念和操作容器,而第二种是基于项的(或者如果您喜欢基于操作的话),即可以或不能属于角色或执行此类任务和/或操作(项)的用户或用户组。 在这里,这两种产品最重要的特点和区别是: AzMan女士: *是COM。*它配备了一个MMC 2.0 (COM)控制台。*它的存储可以是XML文件或ADAM (Active应用程序模式-e)。*是以角色为基础的。*它支持静态/动态应用程序组、成员/非成员。*基于角色->任务->操作的结构。(分层角色和任务,无操作)。*授权只能添加到角色中。*它没有执行“委托”概念。*它不管理“当时”的授权。*它不会触发事件。*唯一的授权类型是“允许”。(要“拒绝”,需要将用户/组从其角色中删除)。*它支持脚本/ Biz规则。*它支持用户/组和ADAM用户。 NetSqlAzMan: *它是.NET 2.0。*它配备了一个MMC3.0 (.NET)控制台。*它的存储是Server数据库(2000/MSDE/2005/Express)。*它基于Tdo类型的数据对象技术。*是以项目为基础的。*基于角色->任务->操作的结构。(都是等级的)。*授权可以添加到角色、任务和操作中。*它支持静态/动态应用程序组、成员/非成员。*直接从控制台进行LDAP查询测试。*这取决于时间。*符合代表要求。*触发事件(ENS)。*它支持4种授权类型:O允许有授权(授权和授权委托)。O允许(授权)。不否认(未经授权)。O中立(中立权限,它依赖于较高级别的项权限)。*等级授权。*它支持脚本/ Biz规则(用.NET - C# - VB编译而不是解释)*它支持在Server数据库中定义的Active Directory用户/组和自定义用户。
这是另一个问题。
Azman示例代码:http://channel9.msdn.com/forums/sandbox/252978-AzMan-in-the-Enterprise-Sample-Code http://channel9.msdn.com/forums/sandbox/252973-Programming-AzMan-Sample-Code
using System;
using System.Security.Principal;
using System.Runtime.InteropServices;
using AZROLESLib;
namespace TreyResearch {
public class AzManHelper : IDisposable {
AzAuthorizationStore store;
IAzApplication app;
string appName;
public AzManHelper(string connectionString, string appName) {
this.appName = appName;
try {
// load and initialize the AzMan runtime
store = new AzAuthorizationStore();
store.Initialize(0, connectionString, null);
// drill down to our application
app = store.OpenApplication(appName, null);
}
catch (COMException x) {
throw new AzManException("Failed to initizlize AzManHelper", x);
}
catch (System.IO.FileNotFoundException x) {
throw new AzManException(string.Format("Failed to load AzMan policy from {0} - make sure your connection string is correct.", connectionString), x);
}
}
public void Dispose() {
if (null == app) return;
Marshal.ReleaseComObject(app);
Marshal.ReleaseComObject(store);
app = null;
store = null;
}
public bool AccessCheck(string audit, Operations op,
WindowsIdentity clientIdentity) {
try {
// first step is to create an AzMan context for the client
// this looks at the security identifiers (SIDs) in the user's
// access token and maps them onto AzMan roles, tasks, and operations
IAzClientContext ctx = app.InitializeClientContextFromToken(
(ulong)clientIdentity.Token.ToInt64(), null);
// next step is to see if this user is authorized for
// the requested operation. Note that AccessCheck allows
// you to check multiple operations at once if you desire
object[] scopes = { "" };
object[] operations = { (int)op };
object[] results = (object[])ctx.AccessCheck(audit, scopes, operations,
null, null, null, null, null);
int result = (int)results[0];
return 0 == result;
}
catch (COMException x) {
throw new AzManException("AccessCheck failed", x);
}
}
public bool AccessCheckWithArg(string audit, Operations op,
WindowsIdentity clientIdentity,
string argName, object argValue) {
try {
// first step is to create an AzMan context for the client
// this looks at the security identifiers (SIDs) in the user's
// access token and maps them onto AzMan roles, tasks, and operations
IAzClientContext ctx = app.InitializeClientContextFromToken(
(ulong)clientIdentity.Token.ToInt64(), null);
// next step is to see if this user is authorized for
// the requested operation. Note that AccessCheck allows
// you to check multiple operations at once if you desire
object[] scopes = { "" };
object[] operations = { (int)op };
object[] argNames = { argName };
object[] argValues = { argValue };
object[] results = (object[])ctx.AccessCheck(audit, scopes, operations,
argNames, argValues,
null, null, null);
int result = (int)results[0];
return 0 == result;
}
catch (COMException x) {
throw new AzManException("AccessCheckWithArg failed", x);
}
}
// use this to update a running app
// after you change the AzMan policy
public void UpdateCache() {
try {
store.UpdateCache(null);
Marshal.ReleaseComObject(app);
app = store.OpenApplication(appName, null);
}
catch (COMException x) {
throw new AzManException("UpdateCache failed", x);
}
}
}
public class AzManException : Exception {
public AzManException(string message, Exception innerException)
: base(message, innerException)
{}
}
}这是Azman的助手代码。这是丑陋的COM/Interopish的东西。:<
现在检查NetSqlAzMan代码示例:
http://netsqlazman.codeplex.com/wikipage?title=Samples
/// <summary>
/// Create a Full Storage through .NET code
/// </summary>
private void CreateFullStorage()
{
// USER MUST BE A MEMBER OF SQL DATABASE ROLE: NetSqlAzMan_Administrators
//Sql Storage connection string
string sqlConnectionString = "data source=(local);initial catalog=NetSqlAzManStorage;user id=netsqlazmanuser;password=password";
//Create an instance of SqlAzManStorage class
IAzManStorage storage = new SqlAzManStorage(sqlConnectionString);
//Open Storage Connection
storage.OpenConnection();
//Begin a new Transaction
storage.BeginTransaction(AzManIsolationLevel.ReadUncommitted);
//Create a new Store
IAzManStore newStore = storage.CreateStore("My Store", "Store description");
//Create a new Basic StoreGroup
IAzManStoreGroup newStoreGroup = newStore.CreateStoreGroup(SqlAzManSID.NewSqlAzManSid(), "My Store Group", "Store Group Description", String.Empty, GroupType.Basic);
//Retrieve current user SID
IAzManSid mySid = new SqlAzManSID(WindowsIdentity.GetCurrent().User);
//Add myself as sid of "My Store Group"
IAzManStoreGroupMember storeGroupMember = newStoreGroup.CreateStoreGroupMember(mySid, WhereDefined.Local, true);
//Create a new Application
IAzManApplication newApp = newStore.CreateApplication("New Application", "Application description");
//Create a new Role
IAzManItem newRole = newApp.CreateItem("New Role", "Role description", ItemType.Role);
//Create a new Task
IAzManItem newTask = newApp.CreateItem("New Task", "Task description", ItemType.Task);
//Create a new Operation
IAzManItem newOp = newApp.CreateItem("New Operation", "Operation description", ItemType.Operation);
//Add "New Operation" as a sid of "New Task"
newTask.AddMember(newOp);
//Add "New Task" as a sid of "New Role"
newRole.AddMember(newTask);
//Create an authorization for myself on "New Role"
IAzManAuthorization auth = newRole.CreateAuthorization(mySid, WhereDefined.Local, mySid, WhereDefined.Local, AuthorizationType.AllowWithDelegation, null, null);
//Create a custom attribute
IAzManAttribute<IAzManAuthorization> attr = auth.CreateAttribute("New Key", "New Value");
//Create an authorization for DB User "Andrea" on "New Role"
IAzManAuthorization auth2 = newRole.CreateAuthorization(mySid, WhereDefined.Local, storage.GetDBUser("Andrea").CustomSid, WhereDefined.Local, AuthorizationType.AllowWithDelegation, null, null);
//Commit transaction
storage.CommitTransaction();
//Close connection
storage.CloseConnection();
}这本身就说明了一个故事。
发布于 2014-04-30 06:50:57
我认为微软在其博客和SDK上缺乏更新的原因在于,他们已经将所有的工具和设计都转向了一个社交网络/联邦友好的“索赔模式”:
http://msdn.microsoft.com/en-us/magazine/ee335707.aspx
与任何AzMan变体相比,在低AzMan操作级别(代码需要将其与其他变量分离),我们只有一个权限类型声明。这种新的操作样式只是一个URN字符串/操作名称,它是由您(或稍后重新配置)定义的任何可信的索赔提供程序/服务发出的。然后,它们只是用户标识中的一个简单的角色列表,因此很容易使用常见的IsInRole方法进行检查。
这样做的理由是明确的。现代互联网解决方案(也许是一些未来的企业内部网应用程序,一旦隐私法律得到改进)需要多域身份验证和授权,例如这个StackOverflow.com用户帐户和连接的Facebook帐户或您可能链接的任何OpenID帐户。
因此,为了获得授权,您现在可以编写在外部声明和内部“权限声明”之间映射的规则(类似于AzMan操作)。然而,没有标准的格式、层次结构或管理工具。
也许理赔服务(身份验证)+ AzMan XML/SQL (从角色到索赔映射)+索赔权限需求的混合解决方案是前进的方向。到目前为止,我找到的所有样本中都有代码。我希望看到从Active Directory解析到角色到任务声明(操作)的递归组成员,就像我们对AzMan已经有的一样。
为了用新的技术实现“良好的旧”但仍然是必要的“基于角色的安全”模式,需要进行更多的研究。
如果您想要开始,请向(WIF)迈进,该基金会最初出现在.NET 3.5.1中,但后来已经集成到.NET 4.5框架中。
http://msdn.microsoft.com/en-us/library/hh377151(v=vs.110).aspx
https://stackoverflow.com/questions/8750367
复制相似问题