我正在阅读FormsAuthentication以迁移旧应用程序。此应用程序对用户的角色/权限使用以下结构:
class Account
{
public ISet<Role> Roles
{
get;
set;
}
public static bool Has(Permission permission_)
{
foreach (Role role in Roles) {
if (role.Permissions.Contains(permission_)) {
return true;
}
}
return false;
}
}
class Role
{
public ISet<Permission> Permissions
{
get;
set;
}
}
public enum Permission
{
ACCESS_COMPONENT_XYZ
EDIT_FIELD_ABC
VIEW_ENTITY_123
}
Role
只是一组权限,在代码本身中,只检查权限,例如。
model.CanEditFieldAbc = account.Has(Permission.EDIT_FIELD_ABC);
所有这些都由使用NHibernate的数据库支持。现在,正如我所理解的FormsAuthentication,它使用角色的“一维”方法。这意味着,我在AuthenticationToken中只有一个字段来填写我的权限。
我认为我需要以某种方式获取Account实体的所有权限到当前经过身份验证的令牌中。我的问题是:我该怎么做?我了解如何进行身份验证,但不了解如何将自定义权限集(例如字符串)添加到该令牌中?
目前我的登录控制器如下所示:
// "Accounts" is a NHibernate repository on the base controller
Account account = Accounts.Unique(form_.Name);
if (account != null) {
byte[] salt = Convert.FromBase64String(account.Salt);
byte[] password = Convert.FromBase64String(account.Password);
if (PWDTK.ComparePasswordToHash(salt, form_.Password, password)) {
FormsAuthentication.SetAuthCookie(form_.Name, false);
// How to get the complete set of "account.Roles -> Permission" into the Cookie/Token?
}
else {
throw new AuthenticateException("Wrong credentials");
}
}
else {
throw new AuthenticateException("Wrong credentials");
}
当然,我可以从数据库中为每个请求获取当前帐户,然后我在其中拥有一组角色/权限(感谢nhibernate延迟加载等),但这似乎是错误的,因为FormsAuthenticate已经提供了类似的东西吗?