59

Ich entwickle eine ASP.NET MVC 5-Anwendung. Ich habe eine vorhandene Datenbank, aus der ich mein ADO.NET Entity Data Model erstellt habe. Ich habe eine Tabelle in dieser DB, die Spalte "Benutzername" und "Passwort" enthält, und ich möchte sie verwenden, um Authentifizierung und Autorisierung in meiner Webapp zu implementieren; Ich kann keine andere Datenbank oder Tabelle oder Spalte erstellen und kann die standardmäßige Identitätsauthentifizierung aufgrund der Kundenanforderungen nicht verwenden. Ich brauche keine Anmeldung, Passwort ändern oder andere Sachen: nur mit Passwort und Benutzernamen anmelden. Wie kann ich das tun?So implementieren Sie benutzerdefinierte Authentifizierung in ASP.NET MVC 5

Antwort

112

Ja, Sie können. Authentifizierungs- und Autorisierungsteile arbeiten unabhängig voneinander. Wenn Sie einen eigenen Authentifizierungsdienst haben, können Sie einfach OWINs Berechtigungsteil verwenden. Betrachten Sie bereits eine UserManager, die username und password validiert. Daher können Sie den folgenden Code in Ihrem Beitrag zurück meldet sich schreiben:

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

Und Ihre Benutzer-Manager so etwas wie das sein kann:

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

Am Ende können Sie Ihre Aktionen oder Controller schützen Hinzufügen eines Authorize Attributs.

[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

Es tut mir leid, ich bin ein Neuling mit Authentifizierung. Wo soll ich diesen Code benutzen? Wie kann ich MVC anweisen, Benutzernamen und Passwortfelder aus meiner EF-Klasse zu übernehmen? –

+4

Ich habe gerade meinen Beitrag aktualisiert, um Ihre Fragen zu beantworten. –

+0

Danke! Es funktioniert super! –