58 votos

Es posible crear un Sistema de Inicio de sesión ASP.NET MVC, pero no utilizar la MembershipProvider?

Tengo una base de datos existente con una tabla de usuarios, y estamos planeando tener la base de datos y utilizarla para un nuevo sistema construido en ASP.NET MVC. Sin embargo, lo que no estoy seguro acerca de si es o no soy capaz de crear un sistema de login que no uso la integrada en el controlador de cuenta o regular proveedor de pertenencia por lo que aún podemos hacer uso de la estructura de la tabla.

Así que mi pregunta es, ¿será posible? O incluso particularmente difícil si lo es?

¿Cuál es la forma más aceptada de hacer las cosas, y la más simple?

81voto

Matt Wrock Puntos 4772

Yo tenía exactamente el mismo requisito. Yo tenía mi propio usuario y la función de esquema y no desean migrar a la asp.net membresía esquema pero yo quería usar el ASP.NET MVC filtros de acción para la comprobación de autorización y las funciones. Tuve que hacer una buena cantidad de cavar para encontrar exactamente lo que necesita ser hecho, pero al final fue relativamente fácil. Me voy a ahorrar la molestia y diré lo que he hecho.

1) he creado una clase que deriva de Sistema.De la Web.De seguridad.MembershipProvider. MembershipProvider tiene un montón de métodos abstractos para todo tipo de autenticación relacionados con funciones como olvidé mi contraseña, cambiar contraseña, crear un nuevo usuario, etc. Todo lo que quería era la capacidad de autenticar contra mi propio esquema. Así que mi clase contenida principalmente vacía anula. Acabo de anuló ValidateUser:

public override bool ValidateUser(string username, string password)
{
    if (string.IsNullOrWhiteSpace(username) ||
        string.IsNullOrWhiteSpace(password))
      return false;

    string hash = EncryptPassword(password);
    User user = _repository.GetByUserName(username);
    if (user == null) return false;

    return user.Password == hash;
}

2) he creado una clase que deriva de Sistema.De la Web.De seguridad.RoleProvider. De nuevo, yo sólo había vacío implementaciones para toda la pelusa no me necesita, como la creación y el cambio de roles. Acabo de anuló dos métodos:

public override string[] GetRolesForUser(string username)
{
    User user = _repository.GetByUserName(username);
    string[] roles = new string[user.Role.Rights.Count + 1];
    roles[0] = user.Role.Description;
    int idx = 0;
    foreach (Right right in user.Role.Rights)
        roles[++idx] = right.Description;
    return roles;
}

public override bool IsUserInRole(string username, string roleName)
{
    User user = _repository.GetByUserName(username);
    if(user!=null)
        return user.IsInRole(roleName);
    else
        return false;
}

3) Luego he conectado a estas dos clases en mi web.config:

<membership defaultProvider="FirstlookMemberProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear/>
    <add name="FirstlookMemberProvider" type="FirstlookAdmin.DomainEntities.FirstlookMemberProvider, FirstlookAdmin" />
  </providers>
</membership>
<roleManager defaultProvider="FirstlookRoleProvider" enabled="true" cacheRolesInCookie="true">
  <providers>
    <clear/>
    <add name="FirstlookRoleProvider" type="FirstlookAdmin.DomainEntities.FirstlookRoleProvider, FirstlookAdmin" />
  </providers>
</roleManager>

Eso es todo. El valor predeterminado de autorización de la acción de los filtros de utilizar estas clases. Usted todavía tendrá que manejar la página de inicio de sesión y sesión. Solo usar la autenticación de formularios de las clases para este como lo haría normalmente.

11voto

Craig Stuntz Puntos 95965

Cuando alguien te dice que algo relacionado con la seguridad es "fácil", que casi siempre se equivocan. Hay un montón de sutilezas en la seguridad de que los no expertos tienden a perderse.

En particular, cualquier forma de autenticación que explícitamente no lidiar con el almacenamiento en caché es inherentemente roto. Cuando una acción resultado se almacena en caché, esto ocurre dentro de ASP.NET, no necesariamente dentro de la ASP.NET MVC pila. Si examina el código fuente de AuthorizeAttribute, verá que contiene algunos un poco difícil pero efectiva código para asegurarse de que siempre se ejecuta, incluso cuando el resultado de la acción se almacena en caché.

La mejor manera, por el momento, para personalizar ASP.NET MVC es la autenticación para escribir un personalizados ASP.NET proveedor de pertenencia. No voy a decir que esto es infalible, pero hay menos maneras de meterse en problemas con una fractura de aplicación de la seguridad en esta ruta, con otros métodos. Una sustancial ventaja de esta técnica es que se puede sustituir un diferente sistema de autorización en casi cualquier momento, sin cambios en el código.

Si usted debe implementar una costumbre MVC atributo, entonces usted debe subtipo AuthorizeAttribute y reemplazar AuthorizeCore, tomando debida nota de los comentarios en el código fuente con respecto a la seguridad de los subprocesos.

1voto

Robert Koritnik Puntos 45499

Usted tiene al menos dos posibilidades

  • una acción personalizada atributo de filtro que le proporcionará a su autorización de verificación
  • una costumbre IHttpModule que va a llenar todos los datos necesarios para que el usuario que ha iniciado sesión (incluidos los roles) y puede usar los filtros de acción

La segunda opción puede ser utilizado con la web normal formas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X