ASP.. NET MVC标识与现有用户表

本文关键字:用户 NET MVC 标识 ASP | 更新日期: 2023-09-27 17:50:43

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

我想知道是否有可能覆盖一些Identity类来指向那个表来验证用户,这样我就可以使用现有的Identity功能,如控制器上的[authorization]属性,并重定向回登录页面,等等

ASP.. NET MVC标识与现有用户表

当我试图将我的遗留系统升级到OWIN身份验证时,我得到了与您相同的情况,我也有自己的用户表和身份验证工作流,这与ASP完全不同。. NET Identity提供。

首先,我尝试自定义ASP。. NET身份,但它不是排序的方式。我的想法是身份是痛苦的,更复杂的定制遗留应用程序,因为它有很多抽象的水平。

最终我想出了一个解决方案来剥离ASP。NET身份,并自行管理索赔身份。这是令人难以置信的简单,我下面简单的演示代码是如何登录与OWIN没有ASP。NET Identity,希望对您有所帮助:

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();
}

您可以在单独的数据库中拥有Identity,只要它具有标识格式就不会有问题。使用连接字符串将Usermanager/Rolemanager指向其他数据库。

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

你总是可以写你自己的行为。参见@Cuong Le的例子