如何在ASP.NET MVC 5中实现自定义身份validation

我正在开发一个ASP.NET MVC 5应用程序。 我有一个现有的数据库,从中创build了我的ADO.NET实体数据模型。 我在那个包含“用户名”和“密码”列的数据库中有一个表,我想用它们在我的Web应用程序中实现validation和授权; 我无法创build任何其他数据库或表或列,因为客户的要求,我不能使用标准的身份validation。 我不需要pipe理注册,密码更改或其他东西:只需使用密码和用户名login。 我怎样才能做到这一点?

是的你可以。 authentication和授权部分独立工作。 如果你有自己的authentication服务,你可以使用OWIN的授权部分。 考虑你已经有一个UserManagervalidationusernamepassword 。 因此,您可以在回发login操作中编写以下代码:

 [HttpPost] public ActionResult Login(string username, string password) { if (new UserManager().IsValid(username, password)) { var ident = new ClaimsIdentity( new[] { // adding following 2 claim just for supporting default antiforgery provider new Claim(ClaimTypes.NameIdentifier, username), new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), new Claim(ClaimTypes.Name,username), // optionally you could add roles if any new Claim(ClaimTypes.Role, "RoleName"), new Claim(ClaimTypes.Role, "AnotherRole"), }, DefaultAuthenticationTypes.ApplicationCookie); HttpContext.GetOwinContext().Authentication.SignIn( new AuthenticationProperties { IsPersistent = false }, ident); return RedirectToAction("MyAction"); // auth succeed } // invalid username or password ModelState.AddModelError("", "invalid username or password"); return View(); } 

而你的用户pipe理器可以是这样的:

 class UserManager { public bool IsValid(string username, string password) { using(var db=new MyDbContext()) // use your DbConext { // for the sake of simplicity I use plain text passwords // in real world hashing and salting techniques must be implemented return db.Users.Any(u=>u.Username==username && u.Password==password); } } } 

最后,您可以通过添加一个Authorize属性来保护您的操作或控制器。

 [Authorize] public ActionResult MySecretAction() { // all authorized users can use this method // we have accessed current user principal by calling also // HttpContext.User } [Authorize(Roles="Admin")] public ActionResult MySecretAction() { // just Admin users have access to this method }