Ciao,
utilizzo la windows authentication
Ok, in questo caso non avrai il punto 4. Facciamo così, vediamo se riusciamo a risolverla in maniera ancora più semplice di quella descritta nella discussione che ti ho linkato.
Ricapitolando: tu hai creato un RoleProvider custom e l'hai registrato nel web.config. In questo modo, ogni volta che un utente richiede una pagina, ASP.NET richiamerà il metodo GetRolesForUser per conoscere i suoi ruoli.
Nel corpo del metodo, prima di restituire i ruoli come array di stringhe, potresti anche aggiungere il Country ai Claims dell'identità corrente.
public override string[] GetRolesForUser(string username)
{
var identity = HttpContext.Current.User.Identity as WindowsIdentity;
if (identity != null && identity.IsAuthenticated)
{
//Questo è il metodo che usi per recuperare il country di questo utente
string country = MetodoPerRecuperareIlCountry(username);
//Qui aggiungi il country ai claims dell'identità
identity.AddClaim(new Claim(ClaimTypes.Country, country));
}
//Ottengo e restituisco i ruoli
string[] roles = MetodoPerRecuperareIRuoli(username);
return roles;
}
Ma tieni presente che aggiungere il claim del Country da questo metodo potrebbe non essere il punto più opportuno. Per esempio, se stai cachando i ruoli in un cookie (attributo cacheRolesInCookie="true" del nodo roleManager del web.config) il metodo GetRolesForUser
non andrà in esecuzione ad ogni richiesta e perciò perderemmo l'opportunità di aggiungere il claim del country.
Allora forse è meglio aggiungere il country dal metodo Application_PostAuthenticateRequest del global.asax, ma questo devi deciderlo tu.
In un modo o nell'altro, questa soluzione ti evita di "concatenare" il country ai ruoli, e te lo fa aggiungere invece ai claims dell'identità corrente, là dove è più opportuno che si trovi.
Veniamo alla seconda parte del problema:
Avrei la necessità di definire la role come un oggetto custom
Ora che i roles e il country sono "separati", è molto facile scrivere un extension method che ti restituisca l'oggetto MyRole che hai descritto.
L'implementazione dell'extension method sarà simile alla seguente:
public static MyRole GetMyRole(this IPrincipal principal)
{
//Per prima cosa mi assicuro che principal ed identity
//siano dei tipi previsti
var rolePrincipal = principal as RolePrincipal;
if (rolePrincipal == null)
return null;
var windowsIdentity = rolePrincipal.Identity as WindowsIdentity;
if (windowsIdentity == null || !windowsIdentity.IsAuthenticated)
return null;
//Restituisco l'istanza della tua classe MyRole
return new MyRole
{
//Estraggo il country dai claims dell'identità
Country = windowsIdentity.Claims
.Where(c => c.Type == ClaimTypes.Country)
.Select(c => c.Value)
.FirstOrDefault(),
//e i ruoli dalla principal
Roles = rolePrincipal.GetRoles().ToList()
};
}
E poi da un'action o una view ASP.NET MVC lo usi in questo modo:
var myrole = User.GetMyRole();
var country = myrole.Country;
var roles = myrole.Roles;
Lo puoi usare anche da un Authorization attribute personalizzato, se lo scopo è quello di autorizzare le richieste
anche in base al country.
ciao,
Moreno
Modificato da BrightSoul il 27 marzo 2016 23.12 -