Páginas

segunda-feira, 6 de fevereiro de 2012

WIF - Windows Identity Foundation (Configuração do Client)

O que é?
De acordo com o site da Microsoft, o WIF permite que desenvolvedores .NET terceirizem a lógica de acesso (login) em suas aplicações.

Imagine que você trabalha em uma empresa que contêm milhares de sistemas .NET e que cada um tenha o seu própio controle de acesso e que todos trabalhem com o mesmo esquema de usuários atribuidos à perfis (roles).
Nesta situação, seria um trabalho árduo realizar uma manutenção nestes sistemas caso ocorra alguma alteração na lógica do controle de acesso da empresa.

Porque não centralizar em um único local (STS) a parte do controle de acesso e focar mais no negócio de sua aplicação?

Neste post, explicarei um passo a passo de como configurar o WIF em uma aplicação ASP.NET WebForms (com HTTPS) e como apontá-lo para um STS (Security Token Service: Serviço responsável por autenticar o usuário).

Instalação
Para começar a utilizar o WIF, será necessário instalar o SDK disponível aqui: WindowsIdentityFoundation-SDK-3.5.msi. Para este post utilizarei a versão 3.5 do WIF mas, neste link, já está disponível a versão 4.0.

Caso esteja utilizando o Windows Server 2003, instale este KB antes do SDK, que contém o runtime e será necessário para utilizar o WIF (Windows5.2-KB974405-x86.exe)

Configuração
Vamos partir do presuposto que já temos os STSs criados:

Primeiramente, para configurar o WIF no seu projeto web adicione as DLLs "Microsoft.IdentityModel" e "System.IdentityModel" como referência no projeto.



Com as DLLs adicionadas no projeto, edite o arquivo Web.config e adicione as seguintes tags:

1) Em configSections (dentro de configuration), adicione a section do Identity:
<section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
Obs.: Lembre-se que a tag configSections deve, obrigatoriamente, ser a primeira tag dentro de configuration.

2) Dentro da tag configuration adicione a tag do Identity:
<microsoft.identityModel>
  <service>
   <audienceuris>
    <add value="https://localhost/Sistema/default.aspx"/>
   </audienceUris>
   <federatedauthentication>
    <wsfederation passiveRedirectEnabled="false" persistentCookiesOnPassiveRedirects="false" issuer="https://localhost" realm="https://localhost/"/>
    <cookiehandler requireSsl="true"/>
   </federatedAuthentication>
   <certificatevalidation certificateValidationMode="None"/>
   <issuernameregistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
   <trustedissuers>
    <add name="CN=localhost" thumbprint="..."/>
   </trustedIssuers>
  </issuerNameRegistry>
 </service>
</microsoft.identityModel>
Obs.: Em audienceuris adicione a URL de sua aplicação.

3) Em system.web, adicione a tag httpRuntime contendo o atributo requestValidationMode igual à 2.0:
<httpRuntime requestValidationMode="2.0" />
4) Em system.web, adicione a tag pages contendo os atributos validateRequest igual à false, controlRenderingCompatibilityVersion igual à 3.5 e clientIDMode igual à AutoID:
<pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"></pages>
5) Em system.web, adicione dentro da tag httpModules, os módulos do WIF:
<httpModules>
  <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpModules>
Obs.: Caso esteja utilizando o IIS 7.0 (Internet Information Services), adicione os módulos dentro de: system.webServer/modules.
5) Altere o authentication mode para None ou Forms:
<authentication mode="None" />
6) Por fim, altere as configuraçõe do seu WebApplication para que a aplicação rode com SSL (https).

Desenvolvimento
Após configurar a o projeto com o WIF, podemos agora criar a página de login apontando para um STS:

1) No projeto web, abra/crie o arquivo "default.aspx" na raiz da aplicação.

2) Neste arquivo, adicione um registro de referência aos controles ASP.NET WebForms disponibilizados na DLL do WIF:
<%@ Register assembly="Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
 namespace="Microsoft.IdentityModel.Web.Controls" tagprefix="wif" %>
3) Após incluir a tag de referência aos controles do WIF, adicione o controle FederatedPassiveSignIn:
<wif:FederatedPassiveSignIn ID="UsuarioSenhaFazendario_FederatedPassiveSignIn" runat="server"
  OnRedirectingToIdentityProvider="FedSigninWin_RedirectingToIdentityProvider"
  Issuer="https://servidor/UsuarioSenhaSTS/Default.aspx"
  RequireHttps="true" 
  Realm="https://localhost/Sistema/default.aspx" 
  Reply="https://localhost/Sistema/default.aspx" 
  VisibleWhenSignedIn="False" SignInMode="Session"
  DisplayRememberMe="false" ShowButtonImage="false" 
  SignInText="Acessar" TitleText="Clique no botão abaixo para ser redirecionado ao STS:"
  TitleTextStyle-HorizontalAlign="Left"
  OnSignInError="FederatedPassiveSignIn_SignInError" UseFederationPropertiesFromConfiguration="false">
</wif:FederatedPassiveSignIn>
Obs.:
A propriedade Issuer identifica o endereço do STS.
Adicione a URL de sua aplicação nas propriedades Realm e Reply.
4) Como podemos observar, existe na configuração do controle uma referência a dois eventos que devem ser implementados.
protected void FedSigninWin_RedirectingToIdentityProvider(object sender, Microsoft.IdentityModel.Web.RedirectingToIdentityProviderEventArgs e)
{
}

protected void FederatedPassiveSignIn_SignInError(object sender, Microsoft.IdentityModel.Web.Controls.ErrorEventArgs error)
{
   lblMensagem.Text = "Usuário e/ou senha incorreto(s)";
}
Seu WebForm está pronto para utilização!

Referências
http://msdn.microsoft.com/en-us/security/aa570351
http://msdn.microsoft.com/en-us/library/ee517286.aspx

0 comentários:

Postar um comentário