Как реализовать пользовательскую проверку подлинности в ASP.NET MVC 5
Я разрабатываю ASP.NET приложение MVC 5. У меня есть существующая БД, из которой я создал свой ADO.NET модель данных сущности. У меня есть таблица в этой БД, которая содержит столбец "имя пользователя" и "пароль", и я хочу использовать их для реализации аутентификации и авторизации в моем веб-приложении; я не могу создать какую-либо другую базу данных или таблицу или столбец, и я не могу использовать стандартную аутентификацию личности из-за требований клиента. Мне не нужно управлять регистрацией, сменой пароля или другим питания: просто войдите в систему с паролем и именем пользователя. Как я могу это сделать?
1 ответ:
Да, вы можете. Части аутентификации и авторизации работают независимо. Если у вас есть собственная служба аутентификации, вы можете просто использовать часть авторизации OWIN. Считайте, что у вас уже есть
UserManager
который проверяетusername
иpassword
. Поэтому вы можете написать следующий код в своем посте назад войти действие:[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(); }
и ваш менеджер пользователей может быть что-то вроде этого:
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] 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 }