Je tente de créer un schéma d'authentification personnalisé dans ASP.NET MVC à l'aide de l'authentification par formulaire. L'idée que je pourrais avoir différentes zones sur le site qui sera géré - approver sont et la zone de l'utilisateur général, et ceux-ci utiliseront différentes pages de connexion, et ainsi de suite. Donc c'est ce que je veux arriver.Schéma d'authentification/autorisation de formulaire personnalisé dans ASP.net MVC
- accès utilisateur restreint la page (en ce moment je l'ai protégé par un AuthorizeAttribute client)
- L'utilisateur est redirigé vers une page de connexion spécifique (pas le un de Web.config).
- informations d'identification de l'utilisateur sont vérifiées (via système Databse personnalisé) et les journaux utilisateur dans.
apprécierions vraiment d'aide avec ça !!!
C'est ce que je ce que j'ai à ce jour, et il ne fonctionne pas:
public class AdministratorAccountController : Controller
{
public ActionResult Login()
{
return View("Login");
}
[HttpPost]
public ActionResult Login(AdministratorAccountModels.LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
if (model.UserName == "admin" && model.Password == "pass") // This will be pulled from DB etc
{
var ticket = new FormsAuthenticationTicket(1, // version
model.UserName, // user name
DateTime.Now, // create time
DateTime.Now.AddSeconds(30), // expire time
false, // persistent
""); // user data
var strEncryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strEncryptedTicket);
Response.Cookies.Add(cookie);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
// If we got this far, something failed, redisplay form
return View(model);
}
[AdministratorAuthorize]
public ActionResult MainMenu()
{
return View();
}
public class AdministratorAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authenCookie = httpContext.Request.Cookies.Get(FormsAuthentication.FormsCookieName);
if (authenCookie == null) return false;
var ticket = FormsAuthentication.Decrypt(authenCookie.Value);
var id = new FormsIdentity(ticket);
var astrRoles = ticket.UserData.Split(new[] { ',' });
var principal = new GenericPrincipal(id, astrRoles);
httpContext.User = principal;
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var model = new AdministratorAccountModels.LoginModel();
var viewData = new ViewDataDictionary(model);
filterContext.Result = new ViewResult { ViewName = "Login", ViewData = viewData };
}
}
}
Le code d'autorisation de formes est grand. Mais une chose à savoir, je crois que c'est la meilleure pratique de rediriger seulement vers une url si elle est locale. Cela atténue la possibilité d'une attaque de redirection. Voir: http://www.asp.net/mvc/tutorials/security/preventing-open-redirection-attacks –