如何设置有效的内部部署ADFS URI?

我有一个.NET 4.6.2 Windows客户端应用程序,它需要从我们的内部部署ADFS服务器获取身份validation令牌,并使用它来调用ASP.NET核心REST API。 它的客户端名称,id(GUID)和重定向URI已在ADFS中注册。 我正在使用最新的ADAL(v3.13)库来促进身份validation。 我试图获得一个令牌,如ADAL示例代码所示,如​​下所示:

AuthenticationContext authenticationContext = new AuthenticationContext("https:///", false); var result = authenticationContext.AcquireTokenAsync(, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto)); 

AcquireTokenAsync调用返回错误,说: 基于浏览器的身份validation对话框无法完成。 原因:服务器未找到与请求的URI(统一资源标识符)匹配的任何内容。

谁能告诉我:

  1. https:///错误中是否引用了“请求的URI”?
  2. 我是否需要以某种方式向ADFS注册 ,如果是,如何?
  3. 我需要的任何其他信息才能使其工作?

谢谢! 彼得

使用Active Directory联合身份validation服务(ADFS)从Windows客户端为内部部署端点提供身份validation

配置ADFS

配置ADFS有两个部分。

使用ADFS注册客户端应用程序

ADFS需要能够识别请求用户身份validation的应用程序,无论是服务,WPF应用程序,Web客户端还是Office加载项。 我已经通用并添加了以下客户端,我们可以将其用于大多数C#请求; 我们可能需要为Web客户端注册具有不同回调的新客户端。

使用其中的许多工具之一为客户端ID生成GUID。
* CLIENT_ID和APP_NAME应该是唯一的。 *对于Web客户端,重定向URI是auth服务在对用户进行身份validation后重定向您的呼叫的位置。 它应该是一个端点,您可以在其中处理令牌并继续使用客户端应用程序。 重定向URI并不真正用于富客户端/服务/加载项。

 CLIENT_ID = 26E54EC9-7988-4DAE-A527-483A8A78B1C6 APP_NAME = Investplus DESCRIPTION = Invest+ rich client suite REDIRECT_URI = https://server/redirect-adfs.html 

客户注册说明

(可能在向导中,但这是我在网上找到的,它对我们起作用)

  1. 以管理员身份登录AD FS服务器并打开Windows PowerShell命令窗口。
  2. 输入以下命令。 在Windows PowerShell中

    Add-AdfsClient -ClientId -Name -RedirectUri

注册要访问的资源(ADFS中的“依赖方”)

我发现此链接很有用,它会引导您完成向导的步骤以设置依赖方。

依赖方注册说明

服务器团队的管理员需要使用ADFS 添加信赖方信任向导 ,并在“选择数据源”步骤下选择手动输入有关 信赖方的 数据

您需要为此向导提供的值:

 DISPLAY_NAME = "MyInvestApi" (Unique display name for this Relying party) PROFILE = "AD FS Profile" ENABLE_SUPPORT_FOR_WS-FEDERATION_PASSIVE_PROTOCOL = true URL = "https://server/api" (Unique URL for this RP) ADD_ONE_OR_MORE_IDENTIFIERS = eg. "urn:myInvestApi" and "https://server/api" ACCEPT_REMAINING_DEFAULTS 

如果有机会,请添加声明规则

 SEND_LDAP_ATTRIBUTES_AS_CLAIMS = true ATTRIBUTE_STORE = Active Directory SELECT_USEFUL_ATTRIBUTES = User-Principal-Name; Email; Display-Name 

配置/编码客户端应用程序

Microsoft为从C#到Javascript,从iOS到Cordova到Node的各种平台和语言提供Active Directory身份validation库 (ADAL)。

暴露的API在每个主要版本中都发生了显着变化:我使用的是最新的C#库,目前是3.13.5。

该库使编码非常简单,只需几行; 我遇到问题的地方是:

  1. 我找不到用于ADFS安全令牌服务(STS)的URL的解释
  2. 我在这里找不到整个过程的文档(大多数文档都集中在Azure FS上),我很难弄清楚如何为ADFS for ClientRelying party提供的值映射到代码中使用的值。

在代码中使用的ADFS端点/ URL是什么?

Microsoft的最佳做法是命名您的ADFS / STS服务器URL https://sts.domain.com (有些人使用https://adfs.domain.com ,询问您的服务器管理员)。 但是,如果您尝试从浏览器中点击此项,您将获得404 - Not found并尝试在代码中检索令牌,ADAL库会报告:

  The browser based authentication dialog failed to complete. Reason: The server has not found anything matching the requested URI (Uniform Resource Identifier). 

这就是我找到要使用的端点的方式:

  1. ADFS在“ https://sts.domain.com/federationmetadata/2007-06/federationmetadata.xml ”上发布联合元数据
    • 提取此文件并在文本编辑器中打开。
  2. 在配置依赖方时 ,我们在指定资源端点时指定了“启用对WS-Federation Passive Protocol的支持”,因此在XML中搜索PassiveRequestorEndpoint
  3. 使用此节点中的

    – 在我的案例中为https://sts.domain.com/adfs/ls/ 。 我不知道这是否始终是值,或者是否在设置ADFS时指定,因此每个站点可能有所不同。

代码中还有哪些其他值?

我们希望我们的客户端应用程序从ADFS检索JSON Web令牌(JWT),我们可以将其传递给受保护的资源以进行身份​​validation/授权。

最简单的是,可以在3行代码+配置中检索访问令牌,这将显示如何将我们在ADFS中配置的内容转换为ADAL所需的值:

 var stsEndpoint = "https://sts.domain.com/adfs/ls/"; var relyingPartyIdentifier = "urn:myInvestApi"; // Tenant in Azure AD speak, but this is an on-premise service var authority = stsEndpoint + relyingPartyIdentifier; var restResourceUrl = "https://server/api"; var redirectUri = "https://server/redirect-adfs.html"; const string CLIENT_ID = "26E54EC9-7988-4DAE-A527-483A8A78B1C6"; AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); var asyncRequest = authenticationContext.AcquireTokenAsync(restResourceUrl, CLIENT_ID, redirectUri, new PlatformParameters(PromptBehavior.Auto)); var accessToken = asyncRequest.Result.AccessToken; 

有用的参考

  • ASP.NET核心令牌认证指南
  • ADAL – REST服务的本机应用程序 – 通过浏览器对话框使用ACS进行身份validation
  • 使用AD FS身份validation创建业务线Azure应用程序
  • OAuth 2简化

要为Web API发出令牌,我们需要通过为Web API创建信赖方信任来让ADFS知道它。 当我们添加一个回复方时,我们需要为回复方指定标识符,如下图所示(Windows Server 2012 R2): 在此处输入图像描述

然后我们可以使用此标识符作为资源URI来获取此回复方的令牌。 请确保资源URI正确,如上图所示。

这是一篇关于使用OAuth使用ADFS进行开发的文章:

使用OAuth和Active Directory联合身份validation服务开发现代应用程序

根据asdf的版本,您可以使用“发现”来获取要使用的端点。

有关详细信息,请查看此post: http : //www.cloudidentity.com/blog/2015/08/21/openid-connect-web-sign-on-with-adfs-in-windows-server-2016- TP3 /