it-swarm.com.de

Implementieren der benutzerdefinierten Authentifizierung in ASP.NET MVC 5

Ich entwickle eine ASP.NET MVC 5-Anwendung. Ich habe eine vorhandene Datenbank, aus der ich mein ADO.NET-Entitätsdatenmodell erstellt habe. Ich habe eine Tabelle in dieser Datenbank, die die Spalten "Benutzername" und "Kennwort" enthält, und ich möchte sie verwenden, um die Authentifizierung und Autorisierung in meiner Webapp zu implementieren. Ich kann keine andere Datenbank, Tabelle oder Spalte erstellen und die standardmäßige Identitätsauthentifizierung aufgrund von Kundenanforderungen nicht verwenden. Ich muss mich nicht anmelden, kein Passwort ändern oder andere Dinge erledigen. Logge dich einfach mit Passwort und Benutzername ein. Wie kann ich das machen?

73

Ja, du kannst. Authentifizierungs- und Autorisierungsteile arbeiten unabhängig voneinander. Wenn Sie über einen eigenen Authentifizierungsservice verfügen, können Sie einfach den Autorisierungsteil von OWIN verwenden. Angenommen, Sie haben bereits ein UserManager, das username und password validiert. Daher können Sie den folgenden Code in Ihre Post-Back-Login-Aktion 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 Ihr Benutzermanager kann ungefähr so ​​aussehen:

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, indem Sie ein Authorize -Attribut hinzufügen.

[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
} 
145