對於粗粒度安全性,您可能會發現內置主體代碼有用;用戶對象(及其角色)在.NET中由「主體」控制,但運行時本身可以強制執行此操作。
一個委託人的實現可以是實現定義的,你通常可以注入你自己的; for example in 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...");
}
}
然而,這並不與細幫助(即「Fred可以訪問客戶A但不訪問客戶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
}
}
只想確保您知道:C#是語言。它沒有安全性。 .NET是平臺。這是安全的地方。 – 2009-08-03 15:32:30
thnx約翰 - 我明白不同之處。 – 2009-08-03 17:24:40
要麼你不能擴展Asp.net成員資格,要麼你可以使用準備插入框架 - VisualGuard - http://www.visual-guard.com/EN/-source_soforum.html – 2017-02-27 11:07:41