J'ai une application 3 couches - 1) La couche d'interface utilisateur est une application ASP .NET MVC 2) La couche d'affaires est une bibliothèque de classe 3) La couche d'accès aux données est une bibliothèque de classes. J'ai utilisé l'autorisation basée sur le rôle basée sur des réclamations. Je mis les revendications dans le gestionnaire d'événements Application_AuthenticateRequestrôle autorisation basée dans la couche d'affaires
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
var authenticationCookie =
HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
var ticket = FormsAuthentication.Decrypt(authenticationCookie.Value);
FormsIdentity formsIdentity = new FormsIdentity(ticket);
ClaimsIdentity claimsIdentity = new ClaimsIdentity(formsIdentity);
// Get the roles from database
...
var role = GetUserRole();
claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, role));
ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
Thread.CurrentPrincipal = claimsPrincipal;
}
Maintenant, j'ai deux façons d'accéder au rôle dans la couche d'affaires
1) accéder directement au rôle du principal fil
var principal = Thread.CurrentPrincipal as ClaimsPrincipal;
var claim = principal.Claims.FirstOrDefault(x => x.Type ==
ClaimTypes.Role);
Pour:
- Chaque méthode c un accès implicite au rôle.
Cons
- Difficile à test unitaire, car il dépend d'un objet statique
2) Faire passer le rôle d'un paramètre de la méthode, par exemple, il soit sa
public IUserService {
void CreateUser(User user, string role);
}
Pros
- Facile à test unitaire puisque le rôle est explicitement transmis à la méthode
Contre
- Chaque méthode a besoin d'avoir un paramètre
- Si l'autorisation est modifiée en fonction de l'autorisation de rôle à toute forme d'autorisation, il rompt le système
Quelle est l'alternative? Quelle est la manière standard d'implémenter l'autorisation basée sur les rôles dans la couche de gestion?