2015-05-08 12 views
5

Ho cercato risposta a questa domanda per alcuni giorni, ma non ho riscontrato alcun successo. Pubblicherei i collegamenti, ma probabilmente occuperebbe l'intera pagina.Aggiungi ruoli a ADFS IPrincipal

Così qui è quello che ho ...

Ho un'applicazione MVC, che utilizza il protocollo WC-Federazione. Sono stato in grado di configurare l'applicazione, in modo che autentica gli utenti e restituisce le attestazioni da ADFS. Questo funziona perfettamente. Posso anche estrarre tutte le richieste senza problemi. Ma lo sto facendo all'interno di una delle azioni del controller.

E qui è quello che voglio fare ...

voglio utilizzare ADFS per autenticare l'utente, ma voglio usare i miei ruoli interni per autorizzare l'utente ad avere accesso ai controller specifici (ad esempio [Authorize(Roles = "CoolRole")].) Voglio essere in grado di farlo, perché ho già un'API Web che utilizza OAuth 2.0, con un database SQL Server back-end per gestire utenti e ruoli (utente interno ed esterno). Ora desidero un portale sicuro che consentire agli utenti interni di accedere ai dati con un'esperienza single-sign-on. Guardando il modello di Controller, ho notato che ci sono alcune proprietà associate al processo di autenticazione (OnAuthentication, OnAuthenticationChallenge) e uno per il processo di autorizzazione (OnAuthorization.)

Non necessariamente bisogno del codice, ma mi sento come se Ho colpito un mattone tutto, e ho bisogno di essere indicato nella giusta direzione.

UPDATE

ho provato questo:

protected override void OnAuthorization(
     System.Web.Mvc.AuthorizationContext filterContext) 
{ 
    //Private class to create a new IPrincipal based on my AppUserMgr 
    var user = _setCurrentUser(
        (ClaimsIdentity)filterContext.HttpContext.User.Identity); 
    filterContext.HttpContext.User = user; 

    base.OnAuthorization(filterContext); 
} 

Questa restituito una risposta 401 (non autorizzato).

e ...

protected override void OnAuthentication(
    System.Web.Mvc.Filters.AuthenticationContext filterContext) 
{ 
    //Private class to create a new IPrincipal based on my AppUserMgr 
    var user = _setCurrentUser(
        (ClaimsIdentity)filterContext.HttpContext.User.Identity); 
    filterContext.Principal = user; 

    base.OnAuthorization(filterContext); 
} 

Ciò richiede solo la STS numerose volte, prima che si guasti. Ho persino provato a scambiare dopo l'assegnazione, dopo che la base è stata chiamata in entrambi. Senza fortuna.

Prima di quelli precedenti, ho anche provato ad aggiungere un AuthorizeFilter al controllo, ma che non ha aiutato:

http://pratapreddypilaka.blogspot.in/2012/03/custom-filters-in-mvc-authorization.html

+0

Sei in grado di condividere la tua implementazione. Hai qualche modello in git? – Avi

risposta

3

trovato la risposta, YESSS !!!

Così, ho trovato questo link: http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/

Da lì, ho indovinato la mia strada attraverso, ben sorta di :)

Ecco le basi di quello che ho fatto:

ho finito sovrascrivendo il metodo OnAuthentication del controller, ma assicurandosi comunque di chiamare la base. L'ho fatto da una classe estesa. Ecco il concetto:

public class AdfsController : Controller 
{ 
    //Some code for adding the AppUserManager (used Unity) 
    protected override void OnAuthentication(
      System.Web.Mvc.Filters.AuthenticationContext filterContext) 
    { 
     base.OnAuthentication(filterContext); 
     //Private method to set the Principal 
     _setCurrentUser(filterContext.Principal); 
    } 

    private void _setCurrentUser(IPrincipal principal) 
    { 
     //Put code to find to use your ApplicationUserManager or 
     //dbContext. roles is a string array 

     foreach(var role in roles) 
     { 
      ((ClaimsIdentity)((ClaimsPrincipal)principal).Identity) 
       .AddClaim(new Claim(ClaimTypes.Role, role)); 
     } 
    } 
} 

Nel Controller, è ora possibile aggiungere il seguente:

public class HomeController : AdfsController 
{ 
    //I used a magic string for demo, but store these in my globals class 
    [Authorize(Roles = "CoolRole")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Ho provato questo controllando un ruolo assegnato all'utente corrente, e che ha funzionato! Quindi ho cambiato il ruolo in qualcosa come "reject", a cui l'utente non è stato assegnato; e ho ricevuto un 401 non autorizzato. Quindi, sì, molto bello!

So che sono stato io a chiederlo, ma spero che qualcuno lo trovi utile e li salvi un po 'di tempo.

~ Ciao!

+0

Ho usato il codice dal link che hai postato, sarebbe bello vederlo aggiunto alla tua risposta. – Nacht

-2

ADFS è l'autenticazione/servizio token in Azure. per abilitare l'autenticazione basata su ruoli, è possibile utilizzare il servizio Azure RBAC (controllo di accesso basato sui ruoli) per aumentare le rivendicazioni che si ottengono da ADFS e aggiungere i ruoli restituiti da RBAC al token e utilizzare lo stesso token nella vostra API in modo da bloccare o fissare il back-end con quella pedina aumentata ... qui è il riferimento per RBAC:

http://azure.microsoft.com/en-in/documentation/articles/role-based-access-control-configure/

+0

Si sta utilizzando Azure AD per gestire gli utenti. Non voglio utilizzare Azure AD per gestire l'utente perché voglio utilizzare ADFS (in sede) per l'autenticazione. Inoltre, non sto cercando di proteggere la mia API. Sto cercando di proteggere una nuova applicazione MVC. – Rogala

+0

Concordato con Rogala – Avi