【问题标题】:How can I use Windows authentication in MVC but use the newer identity database tables for role storage?如何在 MVC 中使用 Windows 身份验证,但使用更新的身份数据库表进行角色存储?
【发布时间】:2018-02-12 03:37:57
【问题描述】:

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

【问题讨论】:

标签: c# sql asp.net .net oracle


【解决方案1】:

我个人会跳过 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 属性

【讨论】:

  • 很好的答案,我认为这可能有效。我不得不切换到 Oracle Identity 与 AD,但还有其他领域非常适合。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多