.net - personalizada - manejo de sesiones en asp net mvc
AutenticaciĆ³n y autorizaciĆ³n de usuario en ASP.NET MVC (6)
En realidad, hay un tercer enfoque. La funcionalidad de membresía de asp.net se basa en el modelo del proveedor. Puede escribir un proveedor personalizado, pudiendo así proporcionar su propia implementación sobre cómo se almacenan los datos, pero conservando gran parte del beneficio de la membresía de asp.net.
Algunos artículos sobre el tema:
http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx
http://www.asp.net/learn/videos/video-189.aspx
¿Cuál es el mejor método para la autorización / autenticación del usuario en ASP.NET MVC?
Veo que realmente hay dos enfoques:
- Use el sistema de autorización incorporado de ASP.NET.
- Use un sistema personalizado con mi propio usuario, permiso, tablas de UserGroup, etc.
Preferiría la segunda opción, porque el usuario es parte de mi modelo de dominio (y no tengo ninguna experiencia con las cosas integradas de ASP.NET), pero realmente me gustaría escuchar lo que la gente ha estado haciendo en esta área.
Este es un cuarto enfoque. Al usar las clases de seguridad de matrices web , puede usar un proveedor de membresía simple que puede usar EF para que los usuarios y roles puedan ser parte de su modelo de dominio, pero también parte de los asistentes de IPrincipal e IIdentity MVC.
He creado un ejemplo de proyecto de Github para ver cómo se puede utilizar con el auto registro automático y el inicio de sesión de correo electrónico / restablecimiento de contraseña y similares.
Ir con personalizado. MembershipProvider es demasiado pesado para mi gusto. Sí, es posible implementarlo de una manera simplificada, pero luego se percibe realmente mal NotSupportedException o NotImplementedException.
Con una implementación totalmente personalizada, puede usar IPrincipal, IIdentity y FormsAuth. ¿Y realmente qué tan difícil es tu propia página de inicio de sesión y tal?
La forma más fácil es usar nombres de usuario asp.net como nombres de roles. Puede escribir su propio atributo de autorización para manejar la autorización:
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()));
}
}
El código debe manejar el AuthorizeCore para devolver verdadero si el usuario ha iniciado la sesión, y HandleUnauthorizedRequest para redirigir al usuario a la página de inicio de sesión (opcionalmente puede adjuntar la url que regresa).
En los métodos de controlador que necesitan autorización, establezca el atributo sobre ellos:
public class SecretPageController {
[CustomAuthorizationAttribute]
ActionResult Index() {
//Method that requires authorization
return View();
}
}
Establezca también el método de autorización en "Formularios" en la configuración web.
Web.config:
<authentication>
<forms timeout="120"></forms>
</authentication>
Controlador:
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() });
}
}
En el Controlador, cuando el usuario ingresa su nombre de usuario y contraseña, establezca la cookie de autenticación de formularios en TRUE (FormsAuthentication.SetAuthCookie ("registereduser", true)), indicando el nombre de usuario (registereduser en el ejemplo) que se autenticará. Luego, el usuario cierra la sesión, dile a ASP.NET que lo haga llamando a FormsAuthentication.SignOut ().
Modelo:
class SessionModel {
public string UserName {get;set;}
public string Password {get;set;}
public string Error {get;set;}
}
Use un modelo para almacenar los datos del usuario.
Ver (que presenta el tipo 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" />
Use una vista para obtener los datos. En este ejemplo, hay un campo oculto para almacenar la URL que regresa
Espero que esto ayude (tuve que traducir el código, así que no estoy seguro de si es 100% correcto).
Puede que le interese RPX para obtener una API gratuita para autenticar a sus usuarios
http://blog.maartenballiauw.be/post/2009/07/27/Authenticating-users-with-RPXNow-(in-ASPNET-MVC).aspx
Prueba el ASP.Net MVC Membership Starter Kit para una API administrativa
Capturas de pantalla
http://www.squaredroot.com/2009/08/07/mvcmembership-release-1-0/
Conjuntos de cambios de ubicaciones antiguas (históricos)
http://mvcmembership.codeplex.com/SourceControl/list/changesets
Nueva ubicacion:
Sin embargo, otro enfoque es utilizar la membresía de ASP.NET para la autenticación, vincular su clase de usuario a los miembros de ASP.NET y usar su clase de usuario para obtener permisos más detallados. Hacemos esto, porque permite cambiar los proveedores de autenticación muy fácilmente, al tiempo que conserva la capacidad de tener un sistema de permisos complejo.
En general, vale la pena recordar que la autenticación / identidad y el almacenamiento de permisos no son necesariamente el mismo problema.