如何在MVC中使用Windows身份验证,但使用较新的身份数据库表进行角色存储?

dev*_*o00 6 .net c# sql asp.net oracle

我正在使用MVC 5和Windows身份验证,并且需要在数据库中使用角色管理,而不是AD组.我过去曾使用过asp.net成员资格解决方案,但更喜欢使用更现代的身份表.我无法访问AD组.如何才能做到这一点?

ste*_*-fu 2

就我个人而言,我会跳过 ASP.NET Identity 部分,只使用自定义授权过滤器来完成它。

从历史上看,身份验证(你能证明你是谁)和授权(你可以做什么)之间的界限在 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用它来代替Authorize您选择的控制器或操作上的标准属性