【问题标题】:ASP.NET Identity + Windows Authentication for Intranet SiteIntranet 站点的 ASP.NET Identity + Windows 身份验证
【发布时间】:2014-04-25 17:57:21
【问题描述】:

我正在构建一个 Intranet 站点,用户将在公司域中并具有不同的权限级别。我目前正在使用<authentication mode="Windows"/> 来控制站点访问,但似乎我应该使用ASP.NET Identity

例如,假设我的应用程序是组织中每个部门的仪表板。我想创建一个名为 DashboardUsers 的广告组,并将所有可以接触该网站的人都放在这个组中。

我还想限制仪表板中的视图。例如,我只希望 IT 团队看到他们的观点,而财务人员看到他们的观点,等等。

问题 -- 我是否应该使用 Windows 身份验证来控制对站点的访问,然后使用 ASP.NET 身份来获得用户级权限?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-identity


    【解决方案1】:

    我只使用 WindowsAuthentication 做了类似的事情。您可以使用 Authorize 属性标记您的操作:

    [Authorize(Roles = @"DashboardUsers")]
    

    只要此用户是 DashboardUsers AD 组的成员,他们就可以访问此操作。看起来像 MVC 魔法,但实际上就是这么简单。

    不幸的是,这种方法不允许您为不同角色重载操作,因为授权属性不是方法签名的一部分。在您看来,您必须根据当前用户角色显示不同的锚标记。

    即:

    [Authorize(Roles = @"DashboardUsers\Manager")]
    public ActionResult IndexManagers()
    {
    ..
    }
    

    [Authorize(Roles = @"DashboardUsers\Finance")]
    public ActionResult IndexFinance()
    {
    ..
    }
    

    评论后编辑: 由于您的身份来自 AD,您可以在控制器中使用如下逻辑:

    if(User.IsInRole("Finance"))
    {
    ..
    }
    else if(User.IsInRole("IT"))
    {
    ..
    }
    

    这将检查他们也属于哪个 AD 组。我知道这不是很优雅,但我无法想象将 Windows Auth 与自定义身份混合并在您自己的数据库中管理权限也会很优雅。

    【讨论】:

    • 感谢您的回复。我最初是沿着这条路走的,但我认为它不会给我足够的控制权。我基本上需要说,对于DashboardControllerIndex 方法,根据用户角色(IT、财务等)从数据库中获取记录。我的数据库记录被“标记”了所需的角色,所以我可以做类似select * from records where role = User.Role
    • @syllogistic 您在评论中所说的与您在问题中描述的问题截然不同。根据存储在数据库中的用户角色确定要返回的数据与授权访问站点的某些组件不同。如果这是您遇到的问题,请考虑重写您的问题或发布新问题,因为 mambrow 已针对问题的当前状态发布了一个很好的答案。
    【解决方案2】:

    我之前遇到过这种困境,最后创建了一个自定义角色提供程序,我将它与 Windows 身份验证结合使用。我不确定在针对 AD 进行身份验证时是否需要 OWIN 中间件。

    public class MyAwesomeRoleProvider : RoleProvider
    {
        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            // i talk to my database via entityframework in here to add a user to a role.
        }
    
        // override all the methods for your own role provider
    }
    

    配置文件

    <system.web>
        <authentication mode="Windows" />
        <roleManager enabled="true" defaultProvider="MyAwesomeRoleManager">
          <providers>
            <clear />
            <add name="MyAwesomeRoleManager" type="MyAwesomeNamespace.MyAwesomeRoleProvider" connectionStringName="MyAwesomeContext" applicationName="MyAwesomeApplication" />
          </providers>
        </roleManager>
    </system.web>
    

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 2017-04-17
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2015-04-08
      • 2014-02-05
      相关资源
      最近更新 更多