web-dev-qa-db-fra.com

Comment implémenter une authentification personnalisée dans ASP.NET MVC 5

Je développe une application ASP.NET MVC 5. J'ai une base de données existante, à partir de laquelle j'ai créé mon modèle de données d'entité ADO.NET. J'ai dans cette base de données une table contenant les colonnes "nom d'utilisateur" et "mot de passe", et je souhaite les utiliser pour implémenter l'authentification et l'autorisation dans mon Webapp; Je ne peux créer aucune autre base de données, table ou colonne et je ne peux pas utiliser l'authentification d'identité standard en raison des exigences du client. Je n'ai pas besoin de gérer l'inscription, le changement de mot de passe ou d'autres éléments: il suffit de vous connecter avec mot de passe et nom d'utilisateur. Comment puis je faire ça?

73

Oui, vous pouvez. Les pièces d'authentification et d'autorisation fonctionnent indépendamment. Si vous avez votre propre service d'authentification, vous pouvez simplement utiliser la partie autorisation de OWIN. Considérez que vous avez déjà une UserManager qui valide username et password. Par conséquent, vous pouvez écrire le code suivant dans votre action de connexion post-retour:

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

Et votre gestionnaire d'utilisateurs peut être quelque chose comme ça:

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

En fin de compte, vous pouvez protéger vos actions ou vos contrôleurs en ajoutant un attribut 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
} 
145