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

时间:2015-05-26 10:05:07

标签: c# asp.net-mvc identity

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

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

2 个答案:

答案 0 :(得分:2)

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

首先,我曾尝试自定义ASP.NET身份,但并没有这样做。我的想法是身份是痛苦的,并且为遗留应用程序定制要复杂得多,因为它有很多抽象级别。

最终,我提出了解决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();
}

答案 1 :(得分:0)

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

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

您可以随时编写自己的OWIN行为。请参阅@Cong Le的示例