如何将filter属性中的角色与我的数据库相关联?

时间:2013-02-17 14:07:25

标签: asp.net-mvc roles

Asp.net MVC用于查看用户是否处于哪个角色的数据源是什么。我如何更改它以便它可以与我自己的数据库表一起使用(当我写[Autorize(Roles="admin")]时,如果用户在角色中,它会在表中检查)

1 个答案:

答案 0 :(得分:4)

  

Asp.net MVC用于查看用户是否处于哪个角色的数据源是什么。

它使用web.config中配置的RoleProvider。如果要使用自定义表,可以通过继承custom role provider类并实现抽象成员来编写RoleProviderIsUserInRole方法是您应该始终实现的方法,因为这是在这种情况下将使用的方法:

public class MyRoleProvider: RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        // go and hit your custom datasource to verify if the user 
        // is in the required role and return true or false from this
        // method
        ...
    }
}

然后,您可以在web.config中注册自定义角色提供程序,以替换默认角色:

<system.web>
    ...
    <roleManager enabled="true" defaultProvider="MyRoleProvider"> 
        <providers> 
            <add name="MyRoleProvider" type="Mynamespace.MyRoleProvider" /> 
        </providers> 
    </roleManager>
</system.web>

如果您不想使用任何提供程序(从您的previous question判断似乎是这种情况),那么您应该编写一个不使用角色提供程序的自定义Authorize属性根本就是使用你的一些自定义代码:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.User.Identity.IsAuthenticated)
        {
            // no user is authenticated => no need to go any further
            return false;
        }

        // at this stage we have an authenticated user
        string username = httpContext.User.Identity.Name;
        return IsInRole(username, this.Roles);
    }

    private bool static IsInRole(string username, string roles)
    {
        // the username parameter will contain the currently authenticated user
        // the roles parameter will contain the string specified in the attribute
        // (for example "admin")
        // so here go and hit your custom tables and verify if the user is
        // in the required role
        ... 
    }
}

最后使用此自定义属性修饰您的控制器操作,而不是依赖于基于角色提供程序的默认属性:

[MyAutorize(Roles = "admin")]
public ActionResult Index()
{
    ...
}