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.
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
Oui, bien sûr, vous devez attribuer à cet utilisateur le rôle Administrateurs si vous en avez besoin. –
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