【问题标题】:ASP.net MVC - using AuthorizeAttribute in multiple environments with Windows AuthenticationASP.net MVC - 在具有 Windows 身份验证的多个环境中使用 AuthorizeAttribute
【发布时间】:2011-11-18 14:57:41
【问题描述】:

我在我的 ASP.net MVC 3 应用程序中使用 Windows 身份验证。我的系统中有几个不同的角色:

Administrator
PowerUser
GeneralUser

我们制定了一条规则,即每个环境中的 AD 组名称都不同。

例如,在开发中,角色名称将是:

Administrator_Dev
PowerUser_Dev
GeneralUser_Dev

在生产中它只是:

Administrator
PowerUser
GeneralUser

当我需要部署到不同的环境时,在这些不同的环境中使用 Authorize 有没有好的解决方案?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 windows-authentication


    【解决方案1】:

    您不能只实现所有角色吗?除非 Administrator_Dev 角色有可能成为生产站点...

    [Authorize(Roles = "Administrator_Dev, Administrator")]
    

    【讨论】:

    • 我可以,但我不太喜欢在我的代码中看到它。我猜更多的是偏好而不是问题。只是希望有一个更优雅的解决方案。
    • @Dismissile - 我认为它实际上非常优雅。至少比 Aliostad 的解决方案更优雅。您的另一个选择是将它们添加为 Web.Config 条目并加载它们,这更加丑陋和令人头疼。
    • @Mystere Man - 我认为您不能从 web.config 加载它们。传递给属性的参数必须在编译时解析。我发现这两种解决方案都很好(前提是您不要忘记将这些字符串放在常量变量中)
    • @PenchoIlchev - 你是对的,脑子放屁。我正在考虑将它们加载到编译时引用的变量中,但当然你只能使用常量,所以这行不通.
    • 但是,如果同时授予“Administrator_dev 和管理员”两个角色的访问权限,那么 Administrators_dev 将获得对许多公司可能不正确的生产访问权限?到底有没有?
    【解决方案2】:

    我能想到的唯一解决方案是条件编译。

    使用条件编译在文件中定义这些常量。

    #if DEV
    public const string AdministratorGroupName = "Administrator_Dev";
    #else
    public const string AdministratorGroupName = "Administrator";
    #endif
    

    这是使用需要在编译时定义的自定义属性的声明式授权的问题之一。

    另一种选择是拥有另一个自定义属性并自己实现操作过滤器。

    【讨论】:

      【解决方案3】:

      我只是在 web.config 中创建应用程序特定的配置部分,将环境特定的 AD 组的名称放在应用程序配置部分中,然后使用授权属性上的配置属性。然后,我可以通过为每个环境使用自定义 web.config 来更改组名。对于大多数应用程序,无论如何您都需要能够为每个环境提供不同的连接字符串。有了这个,你就可以使用内置的授权属性。

      【讨论】:

      • 这听起来像我需要的,但我对 web.config 不熟悉;这方面的一个例子会很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2011-07-17
      • 2013-09-15
      相关资源
      最近更新 更多