Meilleur auteur de réponses
Authentification et roles

Question
-
Bonjour,
j'ai une application où nous gérons une partie de notre sécurité avec les roles et les web.config :
<configuration>
<locationpath="RoleAutorise.aspx">
<system.web>
<authorization>
<allowroles="AdministrateurPrincipal"/>
<denyusers="*"/>
</authorization>
</system.web>
</location>
<locationpath="RoleNonAutorise.aspx">
<system.web>
<authorization>
<allowroles="AdministrateurSecondaire"/>
<denyusers="*"/>
</authorization>
</system.web>
</location>
</configuration>
Mon authentification utilise cette form.
<authenticationmode="Forms"><formsloginUrl="~/Account/Login.aspx" defaultUrl="~/Default.aspx"name="compte" /></authentication>
Il nous faut maintenant implémenter nos roles sachant qu'ils sont déduits de notre SI
J'ai vu deux façons pour le faire
Méthode 1 : faire un RoleProvider personnel
<roleManagerenabled="true"defaultProvider="DispositifRoleProvider">
<providers>
<clear/>
<addname="DispositifRoleProvider"type="WebApplication1.DispositifRoleProvider"applicationName="/"/>
</providers>
</roleManager>
Method 2: utiliser Application_PostAuthenticateRequest in Global.asax pour définir les roles
protected voidApplication_PostAuthenticateRequest(Objectsender, EventArgse)
{
if(HttpContext.Current.User != null)
{
if(HttpContext.Current.User.Identity.IsAuthenticated)
{
if(HttpContext.Current.User.Identity isFormsIdentity)
{ FormsIdentityid = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicketticket = id.Ticket;
stringuserData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = Thread.CurrentPrincipal = newGenericPrincipal(HttpContext.Current.User.Identity, roles);
}
}
}
Quand je passe dans cette méthode, l'objet Session n'est toujours pas disponible. Donc soit j'utilise le même mécanisme de cookie pour le role ou un autre accès.
Mes questions et mes interrogations :
1 - quelle est la méthode à utiliser (la "best practice") ou du moins celle que vous utilisez ? Application_PostAuthenticateRequest ou définition d'un nouveau provider.
2 - pour récupérer mon role, faut-il mieux utiliser un TicketAuthentification ou un accès en base pour récuperer le profil de mon utilisateur ou autre.
Dans ma problématique 1, j'ai remarqué que pour tout demande (css, image) je passe Application_PostAuthenticateRequest alors qu'il me semble que mon provider n'est utilisé que lorsque dotNet veut utiliser le role.
Par avance merci
Réponses
-
Bonjour
Normalement, la réponse dépend sur ce que vous voulez faire après ça.
Si vous utilisez un RoleProvider vous pouvez avoir une gestion complète des rôles. Si vous avez besoin de ça, vous pouvez l’utiliser.
Par contre, si vous n’avez pas besoin de toute la gestion des rôles, c’est plus simple d’utiliser Application_PostAuthenticateRequest.
Ici vous avez un autre petit exemple :
void Application_PostAuthenticateRequest(object sender, EventArgs e) { var ctx = HttpContext.Current; if (ctx.Request.IsAuthenticated) { string[] roles = LookupRolesForUser(ctx.User.Identity.Name); var newUser = new GenericPrincipal(ctx.User.Identity, roles); ctx.User = Thread.CurrentPrincipal = newUser; } }
Cordialement,
- Marqué comme réponse Florin Ciuca lundi 7 janvier 2013 13:48
Toutes les réponses
-
Bonjour
Normalement, la réponse dépend sur ce que vous voulez faire après ça.
Si vous utilisez un RoleProvider vous pouvez avoir une gestion complète des rôles. Si vous avez besoin de ça, vous pouvez l’utiliser.
Par contre, si vous n’avez pas besoin de toute la gestion des rôles, c’est plus simple d’utiliser Application_PostAuthenticateRequest.
Ici vous avez un autre petit exemple :
void Application_PostAuthenticateRequest(object sender, EventArgs e) { var ctx = HttpContext.Current; if (ctx.Request.IsAuthenticated) { string[] roles = LookupRolesForUser(ctx.User.Identity.Name); var newUser = new GenericPrincipal(ctx.User.Identity, roles); ctx.User = Thread.CurrentPrincipal = newUser; } }
Cordialement,
- Marqué comme réponse Florin Ciuca lundi 7 janvier 2013 13:48
-
Bonjour,
Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?
Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !
Cordialement,
Aurel