我正在创建一个新的Web应用程序,该应用程序需要针对另一个Web应用程序中存在的现有用户表对用户进行身份验证。用户注册,忘记的密码等在该应用程序中处理。我在新应用程序中需要做的就是登录。
我想知道是否有可能覆盖某些Identity类以指向该表以验证用户身份,以便我可以使用现有的Identity功能,例如Controllers上的[Authorize]属性,然后重定向回登录页面等。
最佳答案
在尝试将旧系统升级到OWIN身份验证时,我遇到了与您相同的情况,我也有自己的用户表和身份验证工作流,这与ASP.NET Identity提供的完全不同。
首先,我尝试自定义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();
}
关于c# - 具有现有用户表的ASP.NET MVC身份,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30455442/