我正在构建一个Intranet站点,其中用户将在公司域上并具有不同的权限级别。我目前正在使用<authentication mode="Windows"/>
来控制网站访问权限,但似乎我应该使用ASP.NET Identity。
例如,假设我的应用程序是组织中每个部门的仪表板。我想创建一个名为DashboardUsers
的AD小组,并将可以触及该网站的每个人放在该组中。
我还想限制仪表板中的视图。例如,我只希望IT小组看到他们的观点,财务人员看到他们的观点等等。
问题 - 我应该使用Windows身份验证来控制对网站的访问,然后使用ASP.NET身份进行用户级权限吗?
答案 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>