Partilhar via


Security Application Block com a EntLib 4.1

Olá pessoal, tudo certo?

Ainda falando sobre a Enterprise Library 4.1, hoje vamos olhar o Security Application Block. Segurança de modo geral é um aspecto muito importante na arquitetura de soluções e deve ser tratado com todo cuidado.

Através do Security Application Block, podemos definir os métodos de autenticação de usuário e autorização de acesso às funcionalidades da aplicação, de acordo com os papéis (roles) definidos para cada usuário, de um modo fácil e configurável.

A partir do Hands On Labs da EntLib 4.1, temos alguns exercícios para autenticação e autorização na pasta C:\Enterprise Library 4.1 HOL\CS\Security.

Veja um exemplo de implementação no arquivo SecurityHelper.cs, abaixo:

    1: using System.Security.Principal;
    2: using System.Threading;
    3: using System.Web.Security; 
    4:  
    5: namespace BugSmak.Security
    6: {
    7:     class SecurityHelper
    8:     {
    9:         private SecurityHelper() 
   10:         { }
   11:  
   12:         public static bool Authenticate(string username, string password)
   13:         {
   14:             bool authenticated = false;
   15:  
   16:             // TODO: Authenticate Credentials
   17:             authenticated = Membership.ValidateUser(username, password);
   18:  
   19:             // TODO: Get Roles
   20:             if (!authenticated)
   21:                 return false;
   22:  
   23:             IIdentity identity;
   24:             identity = new GenericIdentity(username, Membership.Provider.Name);
   25:  
   26:             string[] roles = Roles.GetRolesForUser(identity.Name);
   27:             IPrincipal principal = new GenericPrincipal(identity, roles);
   28:  
   29:             // Place user's principal on the thread
   30:             Thread.CurrentPrincipal = principal;
   31:  
   32:             return authenticated;
   33:         }
   34:         
   35:         public static bool Authorized(string rule)
   36:         {
   37:             bool authorized = false;
   38:  
   39:             // TODO: Check rule-base authorization
   40:             return authorized;
   41:         }
   42:     }
   43: }

A classe SecurityHelper acima implementa os métodos de Autenticação e Autorização, que podemos chamar para esses tratamentos em nossa aplicação. Como um benefício da EntLib, o modelo de programação é legível e de fácil configuração, economizando horas de projetos para a implementação desse mesmo tratamento.

Por exemplo, a partir da definição da classe SecurityHelper , podemos criar um formulário de Sign In, como vemos abaixo:

image

De onde chamamos a autenticação do usuário através do botão Sign In. Abaixo você tem a implementação do formulário acima, com destaque para o método btnLogin_Click(), disparado pelo click no botão Sign In:

    1: using System;
    2: using System.Windows.Forms;
    3: using BugSmak.Security;
    4:  
    5: namespace BugSmak
    6: {
    7:     public partial class LoginForm : Form
    8:     {
    9:         public LoginForm()
   10:         {
   11:             InitializeComponent();
   12:         }
   13:  
   14:         private void btnLogin_Click(object sender, EventArgs e)
   15:         {
   16:             string username = this.txtUsername.Text;
   17:             string password = this.txtPassword.Text;
   18:  
   19:             bool authenticated;
   20:             authenticated = SecurityHelper.Authenticate(username, password);
   21:  
   22:             if (authenticated == true)
   23:                 this.DialogResult = DialogResult.OK;
   24:             else
   25:                 this.errorLabel.Visible = true;
   26:         }
   27:     }
   28: }

Nesse caso, a autenticação é feita através da definição prévia de um arquivo de configuração de usuários e credenciais, usado pelo SecurityHelper para validação, como vemos no exemplo abaixo:

image Arquivo: Users.xml

Com o código acima e usando o Security Application Block, podemos ainda autenticar nossos usuários e validar as funcionalidades liberadas de acordo com cada perfil. Por exemplo, o métoto Create() abaixo é autorizado para os papéis “Employee”, “Developer” e “Manager” de usuários autenticados, veja:

    1: [PrincipalPermission(SecurityAction.Demand, Role = "Employee")]
    2: [PrincipalPermission(SecurityAction.Demand, Role = "Developer")]
    3: [PrincipalPermission(SecurityAction.Demand, Role = "Manager")]
    4: public static RaiseBug Create()
    5: {
    6:     // TODO: Check Authorization
    7:     return new RaiseBug();
    8: }

O Security Application Block ainda suporta outros métodos de autorização, como o Authorization Rule Provider, o AzMan Provider ou métodos customizados conforme a necessidade. Essa configuração é feita sobre o arquivo de configuração App.Config ou Web.Config, com a ferramenta Enterprise Library Configuration:

image

Usando o Authorization Rule Provider, nosso método de autorização ficaria assim:

    1: public static bool Authorized(string rule)
    2: {
    3:     bool authorized = false;
    4:  
    5:     // TODO: Check rule-base authorization
    6:     // No parameter passed to GetAuthorizationProvider method as 
    7:     // we'll set the defaultAuthorizationInstance in App.config.
    8:     IAuthorizationProvider ruleProvider;
    9:     ruleProvider = AuthorizationFactory.GetAuthorizationProvider();
   10:  
   11:     authorized = ruleProvider.Authorize(Thread.CurrentPrincipal, rule);
   12:  
   13:     return authorized;
   14: }

Ao final, nosso arquivo de configuração terá uma definição semelhante a essa:

    1: <?xml version="1.0" encoding="utf-8"?>
    2: <configuration>
    3:   <configSections>
    4:     <section name="securityConfiguration"
    5:              type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
    6:   </configSections>
    7:   <securityConfiguration defaultAuthorizationInstance="RuleProvider"
    8:                          defaultSecurityCacheInstance="">
    9:     <authorizationProviders>
   10:       <add name="RuleProvider" 
   11:            type="Microsoft.Practices.EnterpriseLibrary.Security.AuthorizationRuleProvider, Microsoft.Practices.EnterpriseLibrary.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
   12:         <rules>
   13:           <add name="Raise Bug" expression="R:Employee OR R:Developer OR R:Manager" />
   14:           <add name="Assign Bug" expression="R:Manager" />
   15:           <add name="Resolve Bug" expression="R:Developer OR R:Manager" />
   16:         </rules>
   17:       </add>
   18:     </authorizationProviders>
   19:   </securityConfiguration>
   20: </configuration>

Em resumo, cada Application Block da EntLib permite uma fácil configuração e uma menor codificação para recursos importantes como a autorização e a autenticação que vimos neste post.

Por enquanto é só! Até o próximo post :)

Waldemir.