Как реализовать пользовательскую аутентификацию в ASP.NET MVC 5

80

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

Джакомо Сантарнекки
источник

Ответы:

158

Да, ты можешь. Части аутентификации и авторизации работают независимо. Если у вас есть собственная служба аутентификации, вы можете просто использовать авторизационную часть 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
} 
Сэм Фараджпур, Гамари
источник
7
Я только что обновил свой пост, чтобы ответить на ваши вопросы.
Sam Farajpour Ghamari
5
Привет, я хотел сообщить вам, что ваш пример github (для tokenauth) решил мои проблемы, большое спасибо! Я бы проголосовал за ваш пример 1000 раз, если бы мог :)
AME
6
Необходимые пакеты nuget: - Microsoft.AspNet.Identity.Core - Microsoft.AspNet.Identity.Owin - Microsoft.Owin - Microsoft.Owin.Host.SystemWeb - Microsoft.Owin.Security - Microsoft.Owin.Security.Cookies - Microsoft.Owin .Security.OAuth - Овин
Матье
5
Я бы хотел, чтобы у вас была открытая награда за этот вопрос, чтобы мы могли дать вам +1000. Пожалуйста, разместите это где-нибудь в блоге, чтобы поисковые системы могли это сделать. Это настолько простое и элегантное решение. Я два дня читал о возможностях OWIN и OAuth2, но не смог подключить провода.
усыновленный
2
@SamFarajpourGhamari: Вы можете объяснить, почему в Loginкоде требуется эта длинная константная строка ? ... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")Я проверил, что без него код работает нормально!
S.Serpooshan