Jak zaimplementować uwierzytelnianie niestandardowe w ASP.NET MVC 5

Rozwijam ASP.NET aplikacja MVC 5. Mam istniejący DB, z którego stworzyłem swój ADO.NET model danych podmiotu. Mam tabelę w tym DB, który zawiera "nazwa użytkownika" i "hasło" kolumna, i chcę ich używać do implementacji uwierzytelniania i autoryzacji w moim Webapp; nie mogę utworzyć żadnej innej bazy danych lub tabeli lub kolumny i nie mogę użyć standardowego uwierzytelniania tożsamości, ze względu na wymagania klienta. Nie muszę zarządzać rejestracją, zmianą hasła ani innymi rzeczami: wystarczy zalogować się za pomocą hasła i nazwy użytkownika. Jak mogę to zrobić?

Author: Giacomo Santarnecchi, 2015-07-23

1 answers

Tak, możesz. Części uwierzytelniania i autoryzacji działają niezależnie. Jeśli masz własną usługę uwierzytelniania, możesz po prostu użyć części autoryzacyjnej OWIN. Uznaj, że masz już UserManager, które sprawdzają username i password. W związku z tym możesz napisać następujący kod w akcji logowania zwrotnego:

[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();
}

A Twój menedżer użytkowników może być coś takiego:

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); 
         }
    }
}

W końcu możesz chronić swoje akcje lub kontrolery, dodając atrybut 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
} 
 128
Author: Sam Farajpour Ghamari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 19:46:46