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:



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();
}
}
}
exactamente lo que necesito, gracias! – Bonk
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