Article provided in the event the website goes down.
personalizzato provider di ruoli per MVC
In un precedente articolo, ho spiegato come creare personalizzato provider di appartenenze per autorizzare l'utente e proteggere i controlli e pagine. Ma cosa succede se vuoi mostrare o proteggere un'area, un controller o una pagina per un gruppo specifico di utenti? Ad esempio, consentire l'accesso al Pannello di amministrazione solo per gli amministratori.
In .Net Framework per questo scopo è il fornitore di ruolo. Ma di nuovo, usa il proprio DB per i ruoli degli utenti del negozio. Creiamo e configuriamo il fornitore di ruolo personalizzato che utilizzerà il nostro DB o qualsiasi altra memoria. Come prima dobbiamo sovrascrivere classe da NET:
Per la funzionalità minima, abbiamo bisogno di implementare e sovrascrivere due funzioni GetRolesForUser e IsUserInRole. In primo luogo, uno viene utilizzato per ottenere un elenco di tutti i ruoli utente (o gruppi):
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[] {}; ;
}
}
Come potete vedere ho individuare l'utente nel mio DB con il parametro nome utente della funzione (nel mio caso è può essere il nome utente o email) e creare la lista di stringhe dei ruoli utente.
seconda funzione è quello di verificare se l'utente nel ruolo (o gruppo):
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;
}
}
allora abbiamo bisogno di configurare in soluzione file web.config di utilizzare provider di ruoli creati. Potrebbe essere necessario impostare cacheRolesInCookie
su false per scopi di debug o il comportamento sarà imprevedibile.
<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>
Ora è possibile proteggere i controller, le azioni, le pagine per un gruppo specifico di utenti che si trovano in ruoli specificati dal set Autorizzare attributo:
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();
}
}
}
esattamente quello che mi serve, grazie! – Bonk
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento.Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Fedor