Le moyen le plus simple est d'utiliser les noms d'utilisateurs asp.net comme noms de rôles. Vous pouvez écrire votre propre attribut authorizarion pour gérer l'autorisation :
public class CustomAuthorizationAttribute:AuthorizeAttribute
{
public CustomAuthorizationAttribute():base()
{
Users = "registereduser";
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//You must check if the user has logged in and return true if he did that.
return (bool)(httpContext.Session["started"]??false);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Redirect("SessionManagement/Index/?returningURL=" +
filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.ToString()));
}
}
Le code doit gérer AuthorizeCore pour renvoyer true si l'utilisateur a commencé la session, et HandleUnauthorizedRequest pour rediriger l'utilisateur vers la page de connexion (optionnellement vous pouvez attacher l'url de retour).
Dans les méthodes du contrôleur qui nécessitent une autorisation, définissez l'attribut sur elles :
public class SecretPageController {
[CustomAuthorizationAttribute]
ActionResult Index() {
//Method that requires authorization
return View();
}
}
Définissez également la méthode d'autorisation sur "Forms" dans la configuration Web.
Web.config :
<authentication>
<forms timeout="120"></forms>
</authentication>
Contrôleur :
public SessionManagementController:Controller {
public ActionResult Index(string returningURL)
{
return View("Index", new SessionModel() { ReturningURL = returningURL});
}
[HttpPost]
public ActionResult Index(SessionModel mod)
{
if (UserAuthenticated(mod.UserName, mod.Password))
{
FormsAuthentication.SetAuthCookie("registereduser", false);
if (mod.UrlRetorno != null)
{
return Redirect(mod.ReturningURL);
}
return RedirectToAction("Index", "StartPage");
}
mod.Error = "Wrong User Name or Password";
return View(mod);
}
bool UserAuthenticated(string userName, string password) {
//Write here the authentication code (it can be from a database, predefined users,, etc)
return true;
}
public ActionResult FinishSession()
{
HttpContext.Session.Clear();//Clear the session information
FormsAuthentication.SignOut();
return View(new NotificacionModel() { Message = "Session Finished", URL = Request.Url.ToString() });
}
}
Dans le contrôleur, lorsque l'utilisateur saisit son nom d'utilisateur et son mot de passe, définissez le cookie d'authentification des formulaires sur TRUE (FormsAuthentication.SetAuthCookie("registereduser",true)), signalant que le nom d'utilisateur (registereduser dans l'exemple) est authentifié. Ensuite, l'utilisateur se déconnecte, en demandant à ASP.NET de le faire en appelant FormsAuthentication.SignOut().
Modèle :
class SessionModel {
public string UserName {get;set;}
public string Password {get;set;}
public string Error {get;set;}
}
Utilisez un modèle pour stocker les données de l'utilisateur.
View (qui présente le type SessionModel) :
<div class="editor-label">
<%: Html.LabelFor(model => model.UserName) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.UserName) %>
<%: Html.ValidationMessageFor(model => model.UserName) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Password) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Password) %>
<%: Html.ValidationMessageFor(model => model.Password) %>
</div>
<div class="field-validation-error"><%:Model==null?"":Model.Error??"" %></div>
<%:Html.HiddenFor(model=>model.ReturningURL) %>
<input type="submit" value="Log In" />
Utilisez une vue pour obtenir les données. Dans cet exemple, il y a un champ caché pour stocker l'URL de retour.
J'espère que cela vous aidera (j'ai dû traduire le code, donc je ne suis pas sûr qu'il soit 100% correct).