59

Я разрабатываю приложение ASP.NET MVC 5. У меня есть существующая БД, из которой я создал мою ADO.NET Entity Data Model. У меня есть таблица в этой БД, которая содержит столбец «имя пользователя» и «пароль», и я хочу использовать их для реализации проверки подлинности и авторизации в моем Webapp; Я не могу создать какую-либо другую базу данных или таблицу или столбец, и я не могу использовать стандартную идентификационную аутентификацию из-за требований клиента. Мне не нужно управлять регистрацией, сменой пароля или другими материалами: просто войдите с паролем и именем пользователя. Как я могу это сделать?Как реализовать пользовательскую аутентификацию в ASP.NET MVC 5

ответ

112

Да, вы можете. Части аутентификации и авторизации работают независимо. Если у вас есть собственный сервис аутентификации, вы можете просто использовать авторизационную часть 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.

[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 
} 
+0

Извините, я новичок с аутентификацией. Где shuold я использую этот код? Как я могу передать MVC для ввода полей имени пользователя e password из моего класса EF? –

+4

Я только что обновил сообщение, чтобы ответить на ваши вопросы. –

+0

Спасибо! Он отлично работает! –

Смежные вопросы