【问题标题】:ASP.NET MVC Identity with existing user table具有现有用户表的 ASP.NET MVC 标识
【发布时间】:2015-05-26 10:05:06
【问题描述】:

我正在创建一个新的 Web 应用程序,该应用程序需要根据来自另一个 Web 应用程序的现有用户表对用户进行身份验证。在该应用程序中处理用户注册、忘记密码等。在我的新应用程序中,我只需要登录。

我想知道是否可以覆盖一些 Identity 类以指向该表以对用户进行身份验证,以便我可以使用现有的 Identity 功能,如控制器上的 [Authorize] 属性并重定向回登录页面等。

【问题讨论】:

标签: c# asp.net-mvc identity


【解决方案1】:

在尝试将我的旧系统升级到 OWIN 身份验证时,我遇到了和你一样的情况,我也有自己的用户表和身份验证工作流程,这与 ASP.NET 身份提供的服务完全不同。

首先,我尝试自定义 ASP.NET 标识,但并没有以这种方式进行整理。我的想法是 Identity 很痛苦,而且为遗留应用定制要复杂得多,因为它有很多抽象级别。

最终我想出了解决方案来剥离 ASP.NET 身份并自己管理声明身份。非常简单,我下面的简单演示代码是如何在没有 ASP.NET 身份的情况下使用 OWIN 登录,希望对您有所帮助:

private void OwinSignIn(User user, bool isPersistence = false)
{
    var claims = new[] {
                new Claim(ClaimTypes.Name, user.Name),
                new Claim(ClaimTypes.Email, user.Email)
            };

    var identity = new ClaimsIdentity(claims, DefaultApplicationTypes.ApplicationCookie);

    var roles = _roleService.GetByUserId(user.Id).ToList();
    if (roles.Any())
    {
        var roleClaims = roles.Select(r => new Claim(ClaimTypes.Role, r.Name));
        identity.AddClaims(roleClaims);
    }

    var context = Request.GetOwinContext();
    var authManager = context.Authentication;

    authManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistence }, identity);
}

[HttpPost]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
        return View();

    var user = _userService.GetByEmail(model.Email);
    if (user != null && (user.Password == model.Password))
    {
        OwinSignIn(user, model.RememberMe);
        return RedirectToLocal(returnUrl);
    }

    ModelState.AddModelError("", "Invalid email or password");
    return View();
}

【讨论】:

  • 如果你让你的数据库符合要求的格式或者你先使用代码,那真的没有那么痛苦
  • @Coulton:我们不使用 EF,即使我们用于用户身份验证和授权的数据库架构也与 ASP.NET Identity 提供的不同。
  • 那么公平。我真的很喜欢这种简单性。
【解决方案2】:

您可以毫无问题地将身份放在单独的数据库中,只要它具有身份格式。使用连接字符串将 Usermanager/Rolemanager 指向您的其他数据库。

如果现有身份验证不是身份设置,您将无法使用身份框架直接连接到其他数据库。身份框架需要某种格式。只要满足以下 cmets 中所述的最低要求,您就可以重写管理器以了解数据库中的用户格式。

不过,您始终可以编写自己的 OWIN 行为。见@Cuong Le 的例子

【讨论】:

  • 如果您可以灵活地调整现有数据库布局以符合标识布局(或者您可以先使用代码对其进行映射),那么它应该可以在现有数据库中正常工作。见stackoverflow.com/a/29600215/894792
  • 这不是一回事吗?数据库必须符合身份框架的最小布局和格式。我会稍微改写我的答案。
猜你喜欢
  • 2015-02-23
  • 2014-11-13
  • 1970-01-01
  • 2017-07-26
  • 2019-10-22
  • 2015-12-22
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多