FormsAuthentication和数据库支持的嵌套角色

时间:2016-03-07 08:14:36

标签: asp.net-mvc-4 nhibernate forms-authentication

我正在阅读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已经提供了类似的东西吗?

1 个答案:

答案 0 :(得分:1)

角色应该由角色提供者处理。在您的情况下,您应该writeconfigure您自己的角色提供者。

登录时,您的代码不必关心提供角色,框架将使用您在配置中定义的角色提供程序。您只需要在成功登录时调用RedirectFromLoginPage(如果您不想使用内置重定向,则需要SetAuthCookie。)

为了检查角色,您应该使用User IsInRole方法。