【问题标题】:Authorization in ASP.NET MVCASP.NET MVC 中的授权
【发布时间】:2010-11-17 15:48:10
【问题描述】:

我正面临一个我已经研究了很多但仍然找不到解决方案的案例。 我的任务是在 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>

【问题讨论】:

  • 无论谁对我的问题评分,我都想知道它有什么问题。不要在没有解释的情况下直接降价。
  • 这是习惯吗?我以前从未见过这样的规则?
  • 是的,它是定制的。但在其根部,它采用 Rule 标记中描述的配置文件并将它们相互比较,就像常规的 ASP.NET Membership 规则一样。如果它会如此不同,我会解释它。
  • 嗯,我认为问题就在于此。 MVC 使用 ActionFilters 拒绝对控制器和操作方法的访问。如果我没看错,而且我不是会员规则专家”,那么您实际上拒绝访问控制器类。看起来与开箱即用的 MVC 如何处理安全性完全脱节,在这种情况下,这个问题真的不是关于 MVC。
  • 很抱歉,如果我不太了解授权,以便能够分辨出这与 MVC 框架处理它的方式不同,但我被赋予了任务,因为我我使用 MVC,我不得不提到它。我正在寻求帮助、提示,无论人们能给我什么。

标签: asp.net-mvc authorization


【解决方案1】:
[Authorize(Roles = "Operator")]
public ViewResult PageOne(){
    return View();
}

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

如果我理解正确,您不会让任何一个角色查看第二页吗?

【讨论】:

  • 检查我的问题中的编辑,这应该可以更好地解释我想要做什么。
  • 好的,我明白了。不知道你怎么能做到这一点......对不起。
【解决方案2】:

授权用于决定允许不拒绝谁。如果您想添加拒绝功能,我想您可以制作自定义 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 方法中同时做一些事情。不过你明白了

【讨论】:

  • 感谢 BritishDeveloper。不过,关于您的评论,我做的事情可能与您想象的不同。首先,我向所有人公开整个应用程序,然后逐步拒绝权限。为了澄清这一点,我不是决定使用该实现的人,我发布的代码不是我编写的,但我必须应对它并做必要的事情来实现所需的功能。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2010-10-21
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多