Ignorando a página Seleção de Provedor de Autenticação Múltipla no SharePoint 2010
Artigo original publicado em 1 de maio de 2011, domingo
ANOTAÇÃO RÁPIDA: Mais um elogio para o pessoal incrível que executa este site. Esta última versão agora mantém ainda MENOS formatação do Word e do Visual Studio do que antes! Eu não achava que era possível criar esse site pior do que era, e ainda que você tenha quebrado, ouso dizer afastado, as minhas expectativas a este respeito. Parabéns! Espero seguir o mesmo caminho em breve e abandonar o Word, Excel e PowerPoint para bloco de notas - quem precisa de qualquer formatação?
Recentemente, eu precisei ignorar a página de seleção de provedor que você começa quando permite vários provedores de autenticação em uma única zona no SharePoint 2010. O cenário que eu tinha era bastante simples, mas a metodologia podia ser estendida um pouco para oferecer suporte a cenários mais complicados. No meu caso, eu tinha a autenticação do Windows e a autenticação baseada em formulários (FBA) habilitadas em uma zona. No entanto, eu sempre quis redirecionar os usuários para a utilização da FBA neste determinado cenário.
Realizar isso era relativamente simples, seguindo estas etapas:
- CRIAR UMA CÓPIA DE BACKUP do default.aspx na pasta C:\Arquivos de Programas\Arquivos Comuns\Microsoft Shared\Extensões de Servidor Web\14\TEMPLATE\IDENTITYMODEL\LOGIN.
- Abrir o Visual Studio e criar um novo projeto do Windows Class Library.
- Adicionar referências ao System.Web, Microsoft.SharePoint.dll e Microsoft.SharePoint.IdentityModel.dll. Infelizmente, o assembly de modelo de identidade só é encontrado no GAC, então eu tive que obter uma cópia do mesmo, colocá-lo na raiz da unidade e adicionar minha referência. Para obter uma sugestão sobre como localizá-lo e copiá-lo, você pode examinar a minha postagem que descreve como fazer isso: https://blogs.technet.com/b/speschka/archive/2010/07/21/writing-a-custom-forms-login-page-for-sharepoint-2010-part-1.aspx.
- Dar nome forte ao assembly, pois ele estará indo no GAC.
- Adicionar uma nova página ASPX ao seu projeto. Honestamente, eu acho que a maneira mais fácil de fazer isso é apenas copiar uma página de um projeto de aplicativo Web ASP.NET existente; dessa forma, você pode copiar os arquivos .aspx, .aspx.cs e .aspx., designer.cs de uma vez. Lembre-se, nesse caso, que desejamos um arquivo chamado “default.aspx” e será mais fácil se ainda não houver código escrito nele e marcação mínima na página.
- No arquivo code-behind (.aspx.cs), alterar o namespace para coincidir com o namespace do seu projeto atual.
- Alterar a classe para herdar de Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage.
- Substituir o evento OnLoad. O que acontece quando os usuários acessam um site com vários provedores de autenticação habilitados é que eles são enviados primeiro para a página /_login/default.aspx (aquela que descrevi em # 1 acima). Nessa página, um usuário vai selecionar qual provedor de autenticação será usado e, em seguida, ele será redirecionado para a página correta para autenticar. Neste cenário, eu disse que sempre quero que os usuários autentiquem com FBA, por isso vou sempre querer enviá-los para /_forms/default.aspx. Se você passar por um logon normal, verá que será redirecionado para /_login/default.aspx, fará sua seleção e postará novamente em /_login/default.aspx. Então, você será redirecionado para a página de logon correta. Portanto, neste caso, eu apenas conferi se a minha página de logon estava sendo postada novamente. Se não foi, então eu sei que nenhuma seleção foi feita ainda para o provedor de autenticação. Então, eu enumero todos os valores da cadeia de consulta e, em seguida, os anexo a /_forms/default.aspx e redireciono o usuário para lá. Aqui está a aparência do trecho de código inteiro:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
try
{
//if this isn't a postback, then the user hasn't selected which
//auth provider they want to use
//in this case we want to always refer the person to forms login
if (!this.IsPostBack)
{
//grab all the query string parameters
System.Text.StringBuilder qp = new System.Text.StringBuilder(2048);
foreach (string key in this.Request.QueryString.Keys)
{
qp.Append(key + "=" + this.Request.QueryString[key] + "&");
}
//redirect to the forms login page
this.Response.Redirect("/_forms/default.aspx?" + qp.ToString());
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
- Agora compile o aplicativo de forma que você possa obter um nome forte para ele e adicione-o à marcação do default.aspx.
- Cole o seguinte no default.aspx; você só precisará alterar a classe da qual a página herda (realçada abaixo); observe que tudo que fiz foi apenas copiá-lo de /_login/default.aspx e substituir o valor Inherits (herda) pelas minhas informações de classe personalizada:
<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="MultiAuthLoginPage._Default,MultiAuthLoginPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=907bf41ebba93579" MasterPageFile="~/_layouts/simple.master" %>
<%@ Assembly Name="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharepointIdentity" Namespace="Microsoft.SharePoint.IdentityModel" Assembly="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Import Namespace="Microsoft.SharePoint.WebControls" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitle" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderId="PlaceHolderPageTitleInTitleArea" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitleInTitleArea" />
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderId="PlaceHolderSiteName" runat="server"/>
<asp:Content ID="Content4" ContentPlaceHolderId="PlaceHolderMain" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageMessage" />
<br />
<br />
<SharepointIdentity:LogonSelector ID="ClaimsLogonSelector" runat="server" />
</asp:Content>
- Registre seu assembly no GAC.
- Copie sua nova página default.aspx personalizada para a pasta C:\Arquivos de Programas\Arquivos Comuns\Microsoft Shared\Extensões de Servidor Web\14\TEMPLATE\IDENTITYMODEL\LOGIN. NOVAMENTE, FAÇA UM BACKUP DO ORIGINAL ANTES DE FAZER ISSO!
- Execute as etapas 1, 11 e 12 em cada front-end da Web no farm.
Isso é tudo o que há para fazer. Eu testei esse procedimento com um logon de usuário padrão, bem como abrir documentos diretamente dos clientes do Microsoft Office 2010. Outro tópico que vale a pena citar aqui: isso altera o comportamento de TODOS os aplicativos Web no farm! Novamente, é por isso que este é um exemplo simples. Entretanto, você pode facilmente procurar o nome do host da solicitação (que mapeia para o seu aplicativo Web) e tomar decisões de autenticação diferentes baseado em qual aplicativo Web está sendo acessado ou, até mesmo, qual conjunto de sites. Obviamente, você também pode tomar outras decisões com base nas informações que possui sobre o usuário atual. As classes HttpRequest.Context.Current, Page.Request e Page.Response podem oferecer muitas informações para você tomar esses tipos de decisões.
Esta é uma postagem de blog traduzida. Consulte o artigo original em Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010