Artículo original publicado el domingo, 1 de mayo de 2011
NOTA AL MARGEN: Una vez más aplausos para el magnífico equipo que dirige este sitio. Esta última versión ahora tiene incluso MENOS formato de Word y Visual Studio que antes. No creí que fuera posible hacer este sitio peor de lo que ya estaba, y ahora han destrozado, qué digo, han superado mis expectativas al respecto. ¡Enhorabuena! Espero seguir su ejemplo pronto y deshacerme de Word, Excel y PowerPoint por el Bloc de notas. De todos modos, ¿quién necesita el formato?
Recientemente tuve la necesidad de omitir la página de selección del proveedor que se obtiene al habilitar varios proveedores de autenticación en una sola zona en SharePoint 2010. El escenario que tenía era bastante sencillo, pero la metodología se puede ampliar bastante para que admita escenarios mucho más complicados. En mi caso, tenía la autenticación de Windows y la autenticación basada en formularios (FBA) habilitadas en una zona. Sin embargo, siempre quise poder redirigir a los usuarios para que usen FBA en este escenario concreto.
Lograr esto fue relativamente sencillo mediante los siguientes pasos:
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);
<%@ 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 ID="Content3" ContentPlaceHolderId="PlaceHolderSiteName" runat="server"/>
<asp:Content ID="Content4" ContentPlaceHolderId="PlaceHolderMain" runat="server">
<SharePoint:EncodedLiteral runat="server" EncodeMethod="HtmlEncode" Id="ClaimsLogonPageMessage" />
<br />
<SharepointIdentity:LogonSelector ID="ClaimsLogonSelector" runat="server" />
Eso es todo. Lo probé con un nombre de inicio de sesión de usuario estándar, además de abrir los documentos directamente desde los clientes de Microsoft Office 2010. Otra cosa que es importante mencionar aquí: esto cambia el comportamiento de TODAS las aplicaciones web de la granja de servidores. Reitero que se trata de un ejemplo sencillo. Sin embargo, fácilmente podría mirar el nombre de host de la solicitud (que se asigna a la aplicación web) y tomar decisiones de autenticación diferentes en función de la aplicación web a la que se tiene acceso o incluso la colección de sitios. Obviamente, puede tomar otras decisiones en función de la información que tenga acerca del usuario actual. Las clases HttpRequest.Context.Current, Page.Request y Page.Response pueden ofrecerle mucha información para tomar este tipo de decisiones.
Esta entrada de blog es una traducción. Puede consultar el artículo original en Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010