限制访问MVC动作

3
我有一个ASP.NET MVC网站,我已经建立了一个权限系统。例如,当当前用户没有足够的权限时,有一些链接是隐藏的。然而,如果他们手动输入该链接的URL,他们仍然可以访问内容。
我知道我可以使用[Authorize]属性来防止没有正确用户角色的用户,但如何实现自己的属性来阻止不符合自定义要求的用户执行操作,而无需在每个操作内部编写手动检查?
2个回答

9
你可以编写一个自定义的Authorize属性,并覆盖AuthorizeCore方法,在该方法中放置自定义的授权逻辑:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authroized = base.AuthorizeCore(httpContext);
        if (!authroized)
        {
            return false;
        }

        // at this stage the base authorization process has passed.
        // now implement your custom authorization logic and return true or false

        // here you have access to the HttpContext and as a consequence to all
        // request and route parameters so you could implement any 
        // authorization logic you want

        // And of course if you want a completely custom authorization logic 
        // ignoring the base functionality don't call the base method above
        // but completely override anything here
    }
}

现在只需要使用这个自定义属性来装饰相应的控制器/操作即可。

谢谢Darin。唯一的问题是我的过滤器可能需要与AuthorizeAttribute结合使用(其中两个属性都被使用,但具有不同的值)。直接从FilterAttribute派生会有问题吗? - Jonathan Wood
是的,您可以从FilterAttribute派生,并通过将自定义授权逻辑放在OnAuthorization方法中实现IAuthorizationFilter接口。 - Darin Dimitrov

1
如果您正在使用ASP.NET Membership,您可以配置一个RoleProvider并为用户分配角色。
然后,您可以使用AuthorizeAttribute上的Roles属性来检查角色。
[Authorize(Roles="Admin, SuperUser")]

1
谢谢,我同时使用ASP.NET Membership和Authorize属性。但是它们都没有回答上述处理自定义标准的问题。 - Jonathan Wood
它怎么不行呢?你需要继承MembershipProvider。同时,还要考虑继承RoleProvider,并将其添加为web.config中的RoleManager。这样,你就可以创建自己的角色,并在不想让他们进入时重定向到“拒绝访问”或其他页面。 - Phil
好的,我并不打算继承MembershipProvider。我只是想提供类似的功能,但是带有一些自定义逻辑,这些逻辑不能直接映射到我的用户角色列表。而且我也不能直接映射到我的角色,因为我还在使用成员角色。 - Jonathan Wood
有道理。我会把这个留在这里,让其他人也能从中受益。但是,既然你正在进行自定义授权,@Darin的答案是最好的。 - Kyle Trauberman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接