2012-04-27 14 views
12

En nuestra red de empresa, los roles en Active Directory (AD) no se asignan adecuadamente a mi aplicación. Así que creé una tabla simple en mi base de datos mapeando a todos los usuarios en AD y sus roles. Literalmente, solo hay dos columnas en esta tabla, usuario y rol.Roles personalizados simples para la autenticación de Windows en asp. ¿red?

Espero aprovechar la potente función de administración en asp.net, quiero usar funciones como [Authorize(Roles = "Managers")]. ¿Existe una forma simple de utilizar estos roles personalizados sin configurar un rol complicado y un proveedor de membresía?

aplicación de fondo: servidor SQL, LINQ, asp.net mvc

Respuesta

11

Es muy fácil de implementar proveedor de funciones personalizadas. Básicamente, necesitarás implementar dos funciones.

vistazo al artículo: Custom Role Provider for MVC

+0

exactamente lo que necesito, gracias! – Bonk

+7

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia.Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Fedor

2
proveedor de funciones

Article provided in the event the website goes down.

personalizada para MVC

En un artículo anterior, se explica cómo crear suscripciones personalizado proveedor para autorizar al usuario y proteger los controles y páginas. Pero, ¿qué sucede si desea mostrar o proteger un área, controlador o página para un grupo específico de usuarios? Por ejemplo, permita el acceso al Panel de administración solo para administradores.

En .Net Framework para este propósito es el proveedor de funciones. Pero, de nuevo, usa una base de datos propia para los roles de usuario de la tienda. Así que creemos y configuremos Custom Role Provider que usará nuestro DB o cualquier otro almacenamiento. Al igual que antes debemos sobreescribir clase de .NET:

enter image description here

enter image description here

enter image description here

Para la funcionalidad mínima, se necesita implementar y sobrescribir dos funciones GetRolesForUser y isUserInRole. En primer lugar, uno se utiliza para obtener una lista de todas las funciones de los usuarios (o grupos):

public override string[] GetRolesForUser(string username) 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 

     var roles = from ur in user.UserRoles 
        from r in db.Roles 
        where ur.RoleId == r.Id 
        select r.Name; 
     if (roles != null) 
      return roles.ToArray(); 
     else 
      return new string[] {}; ; 
    } 
} 

Como se puede ver que busque el usuario en mi base de datos mediante el parámetro nombre de usuario de la función (en mi caso es puede ser nombre de usuario o correo electrónico) y crear la lista de cadenas de roles de usuario.

Segunda función es comprobar si el usuario en el papel (o grupo):

public override bool IsUserInRole(string username, string roleName) 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 

     var roles = from ur in user.UserRoles 
        from r in db.Roles 
        where ur.RoleId == r.Id 
        select r.Name; 
     if (user != null) 
      return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
     else 
      return false; 
    } 
} 

entonces tenemos que configurar en la solución de archivo web.config para utilizar proveedor de funciones creado. Puede ser necesario establecer cacheRolesInCookie en falso para fines de depuración o el comportamiento será impredecible.

<system.web> 
    <compilation debug="true" targetFramework="4.5.2" /> 
    <httpRuntime targetFramework="4.5.2" /> 
    <authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true"> 
     <providers> 
      <clear /> 
      <add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" /> 
     </providers> 
    </roleManager> 
</system.web> 

Ahora se puede proteger a los controladores, acciones, páginas para un grupo específico de usuarios que están en funciones especificadas para Autorizar conjunto de atributos:

using System; 
using System.Web.Mvc; 

namespace Kitsula.Areas.Admin.Controllers 
{ 
    [Authorize(Roles = "Administrators")] 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Admin/Home/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

    } 
} 
Cuestiones relacionadas