2015-12-30 4 views
0

Je suis nouveau à ASP NET MVC authentication et j'avoir des ennuis avec sur mon projet webauthentification 5 contre la base de données

Par défaut (à la suite de la génération du projet), il y a un AccountController qui a une méthode Login

[Authorize] 
public class AccountController : Controller 
{ 
    private UserService _userService; 
    public UserService UserService{ 
     get { return _userService ?? (_userService = new UserService()); } 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl){ 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     //the line with SignInManager is Default in project 
     //var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 

     //I have implemented my User service which checks in DB is there exists such a user with email and password and returns the same SignInStatus 
     var result = UserService.Authenticate(model.Email, model.Password); 

     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
    } 
} 

Mon UserService mise en œuvre:

public class UserService : IUserService 
{ 
    public SignInStatus Authenticate(string email, string password) 
    { 
     if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) 
     { 
      return SignInStatus.Failure; 
     } 

     //TODO: perform authentication against DB account 
     if (email == "[email protected]" && password == "123") 
     { 
      return SignInStatus.Success; 
     } 
     else 
     { 
      return SignInStatus.Failure; 
     } 
    } 
} 

Je l'utilise avec [Authorize] attribut sur mon AdministrationController

public class AdministrationController : Controller 
{ 
    // GET: Admin/Admin 
    [Authorize] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Quand j'entrer dans la zone d'administration de mon site, via http://localhost:53194/administration il ne nécessite pas d'authentification (ne pas afficher l'écran de connexion)

Si je mets l'attribut [Authorize(Roles = "Administrator")] sur ma méthode

public class AdministrationController : Controller 
{ 
    // GET: Admin/Admin 
    [Authorize(Roles = "Administrator")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

L'écran de connexion s'affiche. J'ai mis le email et mot de passe. En appuyant sur le bouton Connexion il entre dans la méthode Login de AccountController, entre dans le cas SignInStatus.Success

Mais aussi le Connexion écran reste. Il n'est pas redirigé vers l'écran Administration normal.

Pouvez-vous me conseiller comment implémenter cette authentification s'il vous plaît. Merci.

Répondre

1

Vous ne semblez pas avoir défini le cookie d'authentification lors de la connexion réussie. L'utilisateur est donc redirigé vers la page d'administration, mais comme il n'a pas de cookie d'authentification valide, il est redirigé vers le formulaire de connexion.

Alors assurez-vous que vous définissez le cookie:

case SignInStatus.Success: 
    var user = new ApplicationUser 
    { 
     Email = model.Email, 
     UserName = model.Email, 
     ... set any other properties that you find convenient 
    }; 
    await SignInManager.SignInAsync(user, false, false); 
    return RedirectToLocal(returnUrl); 
+0

Merci pour vos suggestions. C'est logique. Je dois ajouter l'utilisateur dans un cookie. J'ai ajouté les lignes que vous avez suggérées, mais aussi il reste à la page de connexion sans être autorisé à entrer dans la vue d'administration normale. Peut-être parce que j'utilise l'attribut '[Authorize (Roles =" Administrator ")]'. Dois-je ajouter une certaine logique pour ajouter des rôles pour cet utilisateur? Ou d'une manière ou d'une autre Il est nécessaire de changer l'attribut? – meorfi

+0

Oui, bien sûr, vous devez attribuer à cet utilisateur le rôle Administrateurs si vous en avez besoin. –

+0

en fait, si j'utilise le [Authorize] sans rôles, il ne «déclenche» pas le processus de connexion. Est-il possible d'activer le processus de connexion en utilisant cet attribut mais sans rôles? – meorfi