使用Azure AD对内部部署的Sharepoint 2013进行身份验证

时间:2018-01-11 11:18:23

标签: azure sharepoint-2013 azure-active-directory saml-2.0 adfs

我们的客户有一个Azure AD,其中包含位于全球多个位置的公司中的所有用户。他希望他的用户能够使用Azure AD上的Microsoft帐户登录我们的SP应用程序。

显然,由于Azure AD使用SAML 2.0,而SharePoint使用Ws-Fed(类似于SAML 1.1),我们需要将这些声明从2.0转换为Ws-Fed(或SAML 1.1)。

以前这是使用Azure的Azure Control Services完成的,该服务将在年底(2018年)弃用,因此开发使用它的解决方案毫无意义。

因此,我们发现了一些指南herehere,详细说明了如何在Azure AD和ADFS之间创建声明提供程序信任,并在AD FS之间建立依赖方信任和SharePoint。

理论上,这可以通过以下方式实现:

  1. 用户登录Azure AD上的Microsoft帐户,并将带有声明的SAML 2.0令牌从Azure AD发送到AD FS
  2. 所有声明都传递给AD FS,因为我们以这种方式配置了规则(按照指示here
  3. AD FS将这些从SAML 2.0转换为Ws-Fed(或SAML 1.1)
  4. AD FS将必要的声明映射到UPN(按照说明here)并将结果发送到SharePoint
  5. 我们似乎在转换步骤中遇到问题。 我们使用Fiddler调试了该进程,以查看进出AD FS服务器的请求。 Azure AD声明已成功发送到AD FS,但是当AD FS发出新声明(假设在Ws-Fed或SAML 1.1中)时会遇到错误。

    以下是来自AD FS的堆栈跟踪:

    Microsoft.IdentityServer.Web.RequestFailedException: MSIS7012: An error occurred while processing the request. Contact your administrator for details. ---> System.ServiceModel.FaultException: MSIS3127: The specified request failed.
       at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClientManager.Issue(Message request, WCFResponseData responseData)
       at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClient.Issue(RequestSecurityToken rst, WCFResponseData responseData)
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request)
       --- End of inner exception stack trace ---
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request)
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.RequestBearerToken(MSISSignInRequestMessage signInRequest, SecurityTokenElement onBehalfOf, SecurityToken primaryAuthToken, String desiredTokenType, UInt32 lifetime, Uri& replyTo)
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.RequestBearerToken(MSISSignInRequestMessage signInRequest, SecurityTokenElement onBehalfOf, SecurityToken primaryAuthToken, String desiredTokenType, MSISSession& session)
      at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.BuildSignInResponseCoreWithSerializedToken(String signOnToken, WSFederationMessage incomingMessage)
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.BuildSignInResponseForProtocolResponse(FederationPassiveContext federationPassiveContext)
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.BuildSignInResponse(FederationPassiveContext federationPassiveContext, SecurityToken securityToken)
    
    System.ServiceModel.FaultException: MSIS3127: The specified request failed.
       at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClientManager.Issue(Message request, WCFResponseData responseData)
       at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClient.Issue(RequestSecurityToken rst, WCFResponseData responseData)
       at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request)
    

    我们还进行了内部测试,我们使用本地AD登录到SharePoint网站,以确保AD FS和SharePoint之间的设置正确无误。这按预期工作,SharePoint收到了步骤4中配置的声明。

    对于从SAML 2.0到Ws-Fed(或SAML 1.1)的“转换”过程的任何帮助将不胜感激。

      

    帮助我Obi-Wan Kenobi,你是我唯一的希望!

2 个答案:

答案 0 :(得分:1)

将AD FS'PreventTokenReplays param设置为false

在我们的案例中,这就是我们坚持了几天的原因。在我们阅读的任何地方都没有提到这一点,我们只是在转到AD FS服务器的事件查看器并浏览日志后才发现它。

打开PowerShell,然后使用以下命令添加AD FS管理单元:

Add-PSSnapin Microsoft.Adfs.PowerShell

然后,使用以下命令获取AD FS属性:

Get-adfsproperties

检查PreventTokenReplays参数的值。如果它被设置为假,你应该是好的。如果设置为true,则使用以下命令将其翻转为false:

Set-adfsproperties -PreventTokenReplays $false

现在,您需要重新启动AD FS服务。只需转到services.msc,找到AD FS 2.0 Windows服务,右键单击它,然后点击重启。

答案 1 :(得分:0)

配置概览 创建新的 Azure AD 租户和命名空间。 添加 WS-Federation 身份提供者。 添加 SharePoint 作为信赖方应用程序。 为基于声明的身份验证创建规则组。 配置 X.509 证书。 创建声明映射。 为新的身份提供程序配置 SharePoint。 设置权限。 验证新的提供者

您可以关注此博客以了解分步过程 https://www.sharepointcollabs.com/2017/03/using-microsoft-azure-active-directory.html