Intranet站点的ASP.NET身份+ Windows身份验证

时间:2014-04-25 17:57:21

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

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

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

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

问题 - 我应该使用Windows身份验证来控制对网站的访问,然后使用ASP.NET身份进行用户级权限吗?

2 个答案:

答案 0 :(得分:3)

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

[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与自定义标识混合在一起,并且在您自己的数据库中管理权限也会很优雅。

答案 1 :(得分:1)

我之前遇到过这种困境,并且创建了一个我与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>