59

Zajmuję się tworzeniem aplikacji ASP.NET MVC 5. Mam istniejącą bazę danych, z której utworzyłem mój model danych jednostki podmiotu ADO.NET. Mam tabeli w tym DB, który zawiera kolumnę "nazwa użytkownika" i "hasło", i chcę je wykorzystać do wdrożenia uwierzytelniania i autoryzacji w mojej aplikacji sieci Web; Nie mogę utworzyć żadnej innej bazy danych, tabeli ani kolumny i nie mogę korzystać ze standardowego uwierzytelniania tożsamości ze względu na wymagania klienta. Nie muszę zarządzać rejestracją, zmianą hasła ani innymi kwestiami: wystarczy zalogować się przy użyciu hasła i nazwy użytkownika. Jak mogę to zrobić?Jak zaimplementować uwierzytelnianie niestandardowe w ASP.NET MVC 5

Odpowiedz

112

Tak, możesz. Części uwierzytelniania i autoryzacji działają niezależnie. Jeśli posiadasz własną usługę uwierzytelniania, możesz po prostu użyć części autoryzacyjnej OWIN. Załóżmy, że masz już UserManager, który potwierdza username i password. W związku z tym można napisać następujący kod w swoim post Powrót działania logowanie:

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

I menedżer użytkownik 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żna chronić swoje działania lub kontrolerów przez dodanie atrybutu 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

Przykro mi, jestem nowicjuszem z uwierzytelnianiem. Gdzie shuold używam tego kodu? Jak mogę nakazać MVC pobranie pól username e password z mojej klasy EF? –

+4

Właśnie zaktualizowałem swój post, aby odpowiedzieć na twoje pytania. –

+0

Dzięki! Działa świetnie! –

Powiązane problemy