Como associar todos os provedores de declarações a um aplicativo Web no SharePoint 2010
Artigo original publicado em 20 de março de 2011, domingo
Já ouvi esta pergunta algumas vezes, e foi por isso que quis encontrar programaticamente quais provedores de declarações estão sendo usados por meu aplicativo Web. Esta pergunta geralmente é feita para saber quais SPTrustedIdentityTokenIssuers estão sendo usados, mas o método que demonstrarei revela estes e outros provedores de declarações personalizados que não são habilitados por padrão (porque se estivessem, seriam usados em todos os lugares).
A primeira coisa a fazer é entender que se você estiver se perguntando o que está habilitado para um aplicativo Web, está pensando errado (e é provavelmente que o pessoal tem considerado difícil achar essas informações). Seus provedores de declarações serão aplicados no nível de zona, e não no nível de aplicativo. Assim, em uma URL do SharePoint, como descobrimos essa informação?
Para começar, obtenha um novo SPSite baseado na URL na qual está interessado:
using (SPSite theSite = new SPSite("https://someUrl"))
{
…
}
Quando já tiver o objeto SPSite, você pode obter o aplicativo Web e a zona:
//get the web app
SPWebApplication wa = theSite.WebApplication;
//get the zone for the site
SPUrlZone theZone = theSite.Zone;
Com essas informações, você pode obter SPIisSettings para a zona, que é onde a maior parte das coisas boas reside:
//get the settings associated with the zone
SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);
Uma vez de posse das informações de zona, posso obter seus provedores de autenticação e de declarações. Eles são encontrados nestas duas propriedades: ClaimsAuthenticationProviders e ClaimsProviders. Agora lembre-se de que cada ClaimsAuthenticationProvider possui somente um subconjunto muito pequeno das informações que você obtém ao fazer algo como Get-SPTrustedIdentityTokenIssuers no PowerShell. Se realmente quiser chegar ao núcleo do objeto subjacente, você precisa pegar ClaimsAuthenticationProvider e obter SPTrustedLoginProvider dele. Felizmente isso não é muito difícil. Veja um exemplo no qual estou basicamente consultando uma lista de SPTrustedLoginProviders usando LINQ; observe que, neste exemplo, estou interessado apenas nos provedores de declarações SAML (A.K.A. SPTrustedIdentityTokenIssuer):
//get the token service manager so we can retrieve the appropriate
//trusted login provider
SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;
//get the list of authentication providers associated with the zone
foreach (SPAuthenticationProvider prov in theSettings.ClaimsAuthenticationProviders)
{
//make sure the provider we're looking at is a SAML claims provider
if (prov.GetType() == typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))
{
//get the SPTrustedLoginProvider using the DisplayName
var lp =
from SPTrustedLoginProvider spt in
sptMgr.TrustedLoginProviders
where spt.DisplayName == prov.DisplayName
select spt;
//there should only be one match, so retrieve that
if ((lp != null) && (lp.Count() > 0))
{
//get the login provider
SPTrustedLoginProvider loginProv = lp.First();
}
}
}
Para que fique completo, vou colar o bloco de códigos inteiro abaixo. Neste cenário específico eu estava procurando por todos os SPTrustedIdentityTokenIssuers associados a uma zona, e para cada um eu estava criando uma string com o nome do provedor e a URL para a qual você seria redirecionado para autenticação ao usar aquele provedor.
using (SPSite theSite = new SPSite("https://someUrl"))
{
//get the web app
SPWebApplication wa = theSite.WebApplication;
//get the zone for the site
SPUrlZone theZone = theSite.Zone;
//get the settings associated with the zone
SPIisSettings theSettings = wa.GetIisSettingsWithFallback(theZone);
//if this isn't a claims auth site then bail out
if (!theSettings.UseTrustedClaimsAuthenticationProvider)
{
MessageBox.Show("This is not a SAML claims auth site");
return;
}
//clear the list of providers out
ProviderLst.Items.Clear();
//get the token service manager so we can retrieve the appropriate
//trusted login provider
SPSecurityTokenServiceManager sptMgr = SPSecurityTokenServiceManager.Local;
//get the list of authentication providers associated with the zone
foreach (SPAuthenticationProvider prov in
theSettings.ClaimsAuthenticationProviders)
{
//make sure the provider we're looking at is a SAML claims provider
if (prov.GetType() ==
typeof(Microsoft.SharePoint.Administration.SPTrustedAuthenticationProvider))
{
//get the SPTrustedLoginProvider using the DisplayName
var lp =
from SPTrustedLoginProvider spt in
sptMgr.TrustedLoginProviders
where spt.DisplayName == prov.DisplayName
select spt;
//there should only be one match, so retrieve that
if ((lp != null) && (lp.Count() > 0))
{
//get the login provider
SPTrustedLoginProvider loginProv = lp.First();
//get the login info
string provInfo = prov.DisplayName + " - " +
loginProv.ProviderUri.ToString();
//add the login info to the list
ProviderLst.Items.Add(provInfo);
}
}
}
}
Esta é uma postagem de blog traduzida. Leia o artigo original sobre How To Get All Claims Providers Associated with a Web Application in SharePoint 2010