在Powershell中获取ADFS令牌

时间:2012-11-22 19:18:23

标签: powershell adfs2.0 office365

我们有一个ADFS 2.0环境,用于将我们的Active Directory域与Office 365联合。

最近我们遇到了一个问题,即群集停止响应,从而破坏了我们所有用户的电子邮件/日历访问权限。由于我们目前没有对ADFS进行任何监控,因此我尝试编写一个PowerShell脚本,该脚本将定期尝试对我们的ADFS集群进行身份验证,并获得类似于testexchangeconnectivity.com上的SSO测试的有效令牌。

看来该令牌实际上是由

发出的
  

/ ADFS /服务/信托/ 2005 / usernamemixed

但每当我尝试针对此URI运行invoke-webrequest或new-Webservice代理并提供本地AD凭据时,我会收到400 Bad Request错误。

如何从此端点正确请求令牌,我该怎么办?

3 个答案:

答案 0 :(得分:1)

这个脚本应该可以帮到你 http://gallery.technet.microsoft.com/scriptcenter/Invoke-ADFSSecurityTokenReq-09e9c90c 您将需要.Net Framework 4.5

您还可以使用Connect-MSOL cmdlet模拟到Office 365的ADFS登录以连接到PowerShell会话 - 如果使用ADFS帐户,则会发生ADFS登录。

答案 1 :(得分:1)

我使用WS-Federation和WS-Trust处理使用联合身份验证的产品。我相信您的案例是我们工作流程的一部分。

多年来,我已经针对基于SOAP的API开发了PowerShell自动化,并且在某些时候我将这些知识整合到了库中可用的WcfPS模块中。

模块的code是开源的,尽管它在脚本中很大程度上依赖于来自System.ServiceModelSystem.IdentityModel程序集的.n​​et框架类和程序集。我提到这一点是因为这些程序集中的大多数apis都不能从.NET标准2中获得,所以不幸的是,该模块不能用于非Windows操作系统。您还可以在我的帖子WCFPS - PowerShell module to work with SOAP endpoints中阅读更多相关信息。

这是一个示例,您可以根据服务提供商要求和依赖方配置发出对称和承载令牌。该代码要求对联合安全流程,设置和术语有基本的了解。

# Define the ADFS MEX uri 
$adfsMexUri="https://adfs.example.com/adfs/services/trust/mex"

#region Define authentication endpoints. One for windows and one with username/password
$windowsMixed13AuthenticationEndpoint="https://adfs.example.com/adfs/services/trust/13/windowsmixed"
$usernamePasswordMixed13AuthenticationEndpoint="https://adfs.example.com/adfs/services/trust/13/usernamemixed"
#endregion

#region Define service providers for which we want to issue a symmetric and a bearer token respectively
# Symmatric is for SOAP, WS-Trust
# Bearer is for Web, WS-Federation
$soapServiceProviderAppliesTo="https://myserviceprovider/Soap/"
$webServiceProviderAppliesTo="https://myserviceprovider/Web/"
#endregion

# Parse the MEX and locate the service endpoint
$issuerImporter=New-WcfWsdlImporter -Endpoint $adfsMexUri

#region Issue tokens with windows authentications
$issuerEndpoint=$issuerImporter | New-WcfServiceEndpoint -Endpoint $windowsMixed13AuthenticationEndpoint
$soapToken=New-SecurityToken -Endpoint $issuerEndpoint -AppliesTo $soapServiceProviderAppliesTo -Symmetric
$webToken=New-SecurityToken -Endpoint $issuerEndpoint -AppliesTo $webServiceProviderAppliesTo -Bearer  
#endregion

#region Issue tokens with username/password credentials
$credential=Get-Credential
$issuerEndpoint=$issuerImporter | New-WcfServiceEndpoint -Endpoint $usernamePasswordMixed13AuthenticationEndpoint
$soapToken=New-SecurityToken -Endpoint $issuerEndpoint -Credential $credential -AppliesTo $soapServiceProviderAppliesTo -Symmetric
$webToken=New-SecurityToken -Endpoint $issuerEndpoint -Credential $credential -AppliesTo $webServiceProviderAppliesTo -Bearer    
#endregion

答案 2 :(得分:0)

基本上,您使用WSTrustChannelFactory,创建一个频道,并将其传递给RequestSecurityToken。

Leandro有一个很好的,简洁的sample

如果您不使用.NET 4.5,则需要安装Windows Identity Foundation(