【发布时间】:2018-02-12 03:37:57
【问题描述】:
我正在使用 MVC 5 和 Windows 身份验证,并且需要在数据库中使用角色管理,而不是 AD 组。我过去使用过 asp.net 成员资格解决方案来执行此操作,但更喜欢使用更现代的身份表。我无权访问 AD 组。如何做到这一点?
【问题讨论】:
标签: c# sql asp.net .net oracle
我正在使用 MVC 5 和 Windows 身份验证,并且需要在数据库中使用角色管理,而不是 AD 组。我过去使用过 asp.net 成员资格解决方案来执行此操作,但更喜欢使用更现代的身份表。我无权访问 AD 组。如何做到这一点?
【问题讨论】:
标签: c# sql asp.net .net oracle
我个人会跳过 ASP.NET 身份部分,而只是使用自定义授权过滤器来完成。
从历史上看,身份验证(你能证明你是谁)和授权(你允许做什么)之间的界限在 MVC 中一直很模糊。
当您启用 Windows 身份验证时,身份验证部分会得到处理,并且域\用户名形式的用户身份已经针对 HttpContext 设置。您需要做的是弄清楚它们是授权的。
该问题被标记为 Oracle,您可能希望使用缓存或类似的东西,因此具体方法会有所不同。为简单起见,我们假设您有一个静态的UserManager.IsInRole 类/方法,它接受一个域\用户名和一个逗号分隔的角色字符串来检查并返回一个布尔值,指示用户是否处于允许的角色之一。在实践中,您可能需要处理依赖注入,这对于过滤器可能有点棘手。
public class DbAuthorize : System.Web.Http.AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var isAuthorized = base.IsAuthorized(actionContext);
var user = actionContext.ControllerContext.RequestContext.Principal.Identity;
if (user == null)
return false;
return isAuthorized && UserManager.IsInRole(user.Name, this.Roles);
}
}
然后可以使用它来代替您选择的控制器或操作上的标准 Authorize 属性
【讨论】: