Як реалізувати власну автентифікацію в ASP.NET MVC 5


80

Я розробляю додаток ASP.NET MVC 5. У мене є БД, з якої я створив свою модель даних сутності ADO.NET. У мене в цій БД є таблиця, яка містить стовпець "ім’я користувача" та "пароль", і я хочу використовувати їх для реалізації автентифікації та авторизації в моєму веб-додатку; Я не можу створити будь-яку іншу базу даних, таблицю чи стовпець, а також не можу використовувати стандартну автентифікацію посвідчення через вимоги замовника. Мені не потрібно керувати реєстрацією, зміною пароля та іншими матеріалами: просто увійдіть за допомогою пароля та імені користувача. Як я можу це зробити?

Відповіді:


158

Так, ти можеш. Частинки автентифікації та авторизації працюють самостійно. Якщо у вас є власна служба автентифікації, ви можете просто використовувати частину авторизації OWIN. Вважаємо, у вас вже є a, 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
Я щойно оновив свою публікацію, щоб відповісти на ваші запитання.
Сем Фараджпур Гамарі

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 - Owin
Матьє

5
Я хотів би, щоб у вас була відкрита нагорода за це питання, щоб ми могли дати вам +1000. Будь ласка, розмістіть це десь у блозі, щоб пошукові системи могли до нього дійти. Це настільки просте та елегантне рішення. Я два дні читав про OWIN та OAuth2, і мені не вдалося підключити дроти.
адапілот

2
@SamFarajpourGhamari: Чи можете ви пояснити, чому в Loginкоді потрібен довгий рядок const ? ... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")Я перевірив, що код працює добре і без нього!
S.Serpooshan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.