2015-05-01 24 views
10

Attualmente sto sviluppando un'applicazione ASP.Net MVC 5 con database MS Sql. Devo implementare l'autenticazione e l'autorizzazione basate sull'identità ASP.Net 2.0. Ho appena esaminato i concetti di base di Identity e cerco di implementare lo stesso nella mia applicazione. Dato che il database è già definito, ho bisogno di personalizzare Identity un po '. Quando ho consultato il database, le tabelle sono leggermente diverse rispetto a quelle che normalmente trovo nei progetti di identità di esempio.Autenticazione e autorizzazione personalizzate in base ai diritti utente

enter image description here

Dall'immagine si può vedere che c'è una tabella denominata gruppo e definiti dall'utente serie di diritti a loro sulla base del modulo. Gli stessi diritti saranno accessibili all'utente per impostazione predefinita. Se si desidera modificare qualsiasi diritto, è possibile sovrascriverlo impostando l'autorizzazione nella tabella Diritti utente.

Quindi la mia prima domanda è ASP. Net Identity con autorizzazione e autorizzazione personalizzate è il metodo giusto per implementare uno scenario come questo?

Dal punto di vista della vista, devo generare un menu basato sui diritti del gruppo utente/utente e voglio anche abilitare/disabilitare i pulsanti basati su di essi. Sono stato in grado di generare menu in base ai valori del database. Ma ho bisogno di autorizzare ogni richiesta del cliente e per questo penso che AuthorizeAttribute sia l'opzione migliore. Si prega di suggerire? Sono graditi tutti i buoni schemi di progettazione o post.

risposta

17

Sure Identity così potente e flessibile è possibile personalizzarlo. Usa il tuo diritto utente come una pretesa quindi scrivere una personalizzata AuthorizeAttribute per controllare le richieste di esempio si consideri questo codice:

[HttpPost] 
public ActionResult Login(string username, string password) 
{ 
    if (_userManager.IsValid(username, password)) // your own user manager 
    { 
     var ident = new ClaimsIdentity(
      new[] 
      { 
       // adding following 2 claim just for supporting default antiforgery provider 
       new Claim(ClaimTypes.NameIdentifier, username), 
       new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), 

       new Claim(ClaimTypes.Name, username), 
       // populate assigned user rightID's form the DB and add each one as a claim 
       new Claim("UserRight","FirstAssignedUserRightID"), 
       new Claim("UserRight","SecondAssignedUserRightID"), 
      }, 
      DefaultAuthenticationTypes.ApplicationCookie); 

     HttpContext.GetOwinContext().Authentication.SignIn(
      new AuthenticationProperties { IsPersistent = false }, ident); 
     return RedirectToAction("MyAction"); // auth succeed 
    } 
    // invalid username or password 
    ModelState.AddModelError("", "invalid username or password"); 
    return View(); 
} 

E scrivere l'attributo autorizzare basato affermazione:

public class ClaimsAccessAttribute : AuthorizeAttribute 
{ 
    // in the real world you could get claim value form the DB, 
    // I simplified the example 
    public string ClaimType { get; set; } 
    public string Value { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase context) 
    { 
     return context.User.Identity.IsAuthenticated 
      && context.User.Identity is ClaimsIdentity 
      && ((ClaimsIdentity)context.User.Identity).HasClaim(x => 
       x.Type == ClaimType && x.Value == Value); 
    } 
} 

Alla fine è sufficiente aggiungere l'attributo per le vostre azioni:

[ClaimsAccess(CliamType="UserRight",Value="YourRightID"] 
public ActionResult MyAction() 
{ 
    // also you have access the authenticated user's claims 
    // simply by casting User.Identity to ClaimsIdentity 
    // ((ClaimsIdentity)User.Identity).Claims 
} 

ho omesso gruppo di utenti per semplificare l'esempio e anche io hardcoded alcune parti di cui avete bisogno per scritto e un provider per il recupero da DB.

Problemi correlati