我可以在MVC应用程序中使用两次ASP.Net Identity吗?

时间:2014-02-06 17:08:38

标签: asp.net-mvc authentication claims-based-identity asp.net-identity owin

我正在使用现有数据库开发 MVC 5 Web应用程序。该应用程序确实有两种类型的界面,一种仅用于注册用户,另一种仅用于管理员用户

不幸的是,两种类型的用户都不存储在同一个User表中,而是存储在两个单独的表中,即tblUser和tblAdmin。这是一个继承的数据库,所以我无能为力。

我正在考虑创建两个MVC网站,一个用于注册用户,另一个用于管理员用户。我仍然可以这样做,但是,这意味着重复一些代码。

我想要做的另一个选择就是拥有一个MVC网站,并在其中创建一个区域,以安全地放置所有管理界面和代码。

然后,我将拥有两个帐户控制器(标准帐户控制器和管理员区域中的一个),每个帐户控制器都有自己的登录操作

每个登录操作都会使用最新的 ASP.Net Identity 进行身份验证(即设置ClaimsIdentity,IAuthenticationManager等),类似这样的

private IAuthenticationManager AuthenticationManager
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = _AccountService.VerifyUserLogin(model.UserName, model.Password);
            if (user != null)
            {
                var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

                //Add claim to store doctor ID, roles can also be added here if needed
                identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, Convert.ToString(user.userID)));
                identity.AddClaim(new Claim(ClaimTypes.Role, "AddRoleHere"));

                AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = model.RememberMe }, identity);

                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我担心的是,如果我在两个登录操作中使用 AuthenticationManager.SignIn ,虽然它们是不同的操作,但这会导致问题,例如,共享正在设置的身份验证cookie,线程问题甚至是竞争条件。

我觉得我需要问这个问题,希望在继续这个应用程序之前得到一些回应。

我已经看过以前有这些问题的应用程序,不一定与身份验证有关,但我们只是说它让我非常谨慎,尤其是在涉及数据时。

对此的任何反馈或讨论都会很棒。

感谢。

0 个答案:

没有答案