ASP.NET MVC中的授权

时间:2010-11-17 15:48:10

标签: asp.net-mvc authorization

我正面临一个案例,我已经研究了很多,我仍然找不到解决方案。 我已经完成了在ASP.NET MVC 1应用程序中完成角色实现的任务。 这里的案例反对在应用程序中的权限时通常所做的事情。 让我们假设我们在一个5页的网站中有两个角色,运营商和经理。让一个用户继承这两个角色,我想允许和拒绝根据以下模式查看页面的权限:

对于第1页,Operator角色允许用户查看,但Manager角色拒绝;在这种情况下,我想让拥有这两个角色的用户查看页面;

对于第2页,Operator角色拒绝用户查看,Manager角色也会拒绝;当两个角色都拒绝用户查看页面时,这是我真正想要拒绝某个角色的唯一情况。

因此,每当用户继承多个角色时,应该确定他无法查看某个页面的内容是完全拒绝(拒绝其所有角色),并且每当他有一个允许的角色时,即使他的所有其他角色也是如此如果角色拒绝,他仍然可以查看该页面。

有谁知道如何实现这个?

编辑:

以下只是我们的应用程序中如何完成授权的一瞥,除了站点地图中使用的内容。 您可以看到下面的规则使用多个配置文件。我上面描述的情况需要与下面的实现一起使用。

<Rules xmlns="urn:artemis.runtime.web.security">
    <!-- RUNTIME -->
    <Rule roles="*" resource="^Artemis\.Runtime\.Web\.FilesController\..*" permission="Allow" />

    <!-- ABERTURA GERAL -->
    <Rule roles="*" resource="^Tagus\.Logistics\.Web\.Controllers\..*" permission="Allow" />

<Rule roles="Gestor Cliente,DUN" resource="^Tagus\.Logistics\.Web\.Controllers\.PlanningVsEffectiveController\..*" permission="Deny" />
</Rules>

2 个答案:

答案 0 :(得分:3)

[Authorize(Roles = "Operator")]
public ViewResult PageOne(){
    return View();
}

[Authorize(Roles = "SomeOneElse")]
public ViewResult PageTwo(){
    return View();
}

如果我理解正确,你不会查看第二页的任何角色吗?

答案 1 :(得分:1)

授权用于决定允许谁拒绝。如果你想添加拒绝功能,我想你可以制作一个自定义的Authorize属性。类似的东西:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited=true, AllowMultiple=true)]
public class DenyRolesAttribute : AuthorizeAttribute    
{
    public DenyRolesAttribute(string roles) : base()
    {
        Roles = roles;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }
        IPrincipal user = httpContext.User;

        if (!string.IsNullOrEmpty(Roles) && Enumerable.Any<string>(Roles.Split(','), new Func<string, bool>(user, (IntPtr) user.IsInRole)))
        {
            return false;
        }
        return true;
     }
 }

我在现场做了这个,所以一定要测试并整理一下。或者可以添加AllowRoles和DenyRoles属性,以便在重写的AuthorizeCore方法中执行两者操作。你明白了这个想法