如何设置有效的本地 ADFS URI?
How do I setup a valid on-premise ADFS URI?
我有一个 .NET 4.6.2 Windows 客户端应用程序,它需要从我们的本地 ADFS 服务器获取身份验证令牌并使用它来调用 ASP.NET Core REST API.它的客户端名称、ID (GUID) 和重定向 URI 已在 ADFS 中注册。我正在使用最新的 ADAL (v3.13) 库来促进身份验证。我正在尝试获取令牌,如 ADAL 示例代码中所示:
AuthenticationContext authenticationContext = new AuthenticationContext("https://<adfs-sts-server>/<rest-api-host>", false);
var result = authenticationContext.AcquireTokenAsync(<rest-api-resource-uri>, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto));
AcquireTokenAsync
调用 returns 出错,提示:基于浏览器的身份验证对话框未能完成。原因:服务器未找到与请求的 URI(统一资源标识符)匹配的任何内容。
谁能告诉我:
- 错误中引用的 "requested URI" 是
https://<adfs-sts-server>/<rest-api-host>
还是 <rest-api-resource-uri>
?
- 我是否需要以某种方式向 ADFS 注册
<rest-api-host>
或 <rest-api-resource-uri>
,如果需要,如何注册?
- 我需要任何其他信息才能让它工作吗?
谢谢!
彼得
根据 asdf 的版本,您可以使用 'discovery' 获取要使用的端点。
查看此 post 了解更多详情:http://www.cloudidentity.com/blog/2015/08/21/openid-connect-web-sign-on-with-adfs-in-windows-server-2016-tp3/
要为 Web API 颁发令牌,我们需要通过为 Web API 创建依赖方信任让 ADFS 知道它。当我们添加回复方时,我们需要指定回复方的标识符,如下图(Windows Server 2012 R2):
然后我们可以使用这个标识符作为资源URI来获取这个回复方的令牌。如上图配置请确保资源URI正确
这是一篇关于使用 OAuth 使用 ADFS 进行开发的文章:
Developing Modern Applications using OAuth and Active Directory Federation Services
使用 Active Directory 联合身份验证服务 (ADFS) 为来自 Windows 客户端的本地端点提供身份验证
配置 ADFS
配置 ADFS 分为两部分。
向 ADFS 注册客户端应用程序
ADFS 需要能够识别请求用户身份验证的应用程序,无论它是服务、WPF 应用程序、Web 客户端还是 Office 加载项。我已经通用并添加了以下客户端,我们可以将其用于大多数 C# 请求;我们可能需要为 Web 客户端注册一个具有不同回调的新客户端。
使用众多工具之一为客户端 ID 生成 GUID。
* CLIENT_ID 和 APP_NAME 应该是唯一的。
* 对于 Web 客户端,重定向 URI 是身份验证服务在对用户进行身份验证后重定向您的呼叫的位置。它应该是一个端点,您可以在其中处理令牌并继续您的客户端应用程序。重定向 URI 并没有真正与 rich clients/services/add-ins 一起使用。
CLIENT_ID = 26E54EC9-7988-4DAE-A527-483A8A78B1C6
APP_NAME = Investplus
DESCRIPTION = Invest+ rich client suite
REDIRECT_URI = https://server/redirect-adfs.html
客户注册说明
(在向导中可能可行,但这是我在网上找到的并且对我们有用)
- 以管理员身份登录到 AD FS 服务器并打开 Windows PowerShell 命令 window。
输入以下命令。在 Windows PowerShell
Add-AdfsClient -ClientId <CLIENT_ID> -Name <APP_NAME> -RedirectUri <REDIRECT_URI>
注册要访问的资源('Relying Party' 在 ADFS 中的说法)
我发现 this link 很有用,它会引导您完成设置依赖方的向导步骤。
依赖方注册说明
服务器团队的管理员将需要使用 ADFS 添加依赖方信任向导,并在 "Select Data Source" 步骤下 select 手动输入有关依赖方的数据。
您需要为该向导提供的值:
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
Configuring/Coding 客户端应用程序
Microsoft 为从 C# 到 Javascript,从 iOS 到 Cordova 到 Node.
的一系列平台和语言提供 Active Directory Authentication Libraries (ADAL)
所暴露的API在每个主要版本中都发生了显着变化:我使用的是最新的C#库,目前是3.13.5。
该库使编码非常简单,几行代码;我遇到问题的地方是:
- 我找不到关于 URL 用于 ADFS 的解释
安全令牌服务 (STS)
- 我在这里找不到整个过程的文档(大多数文档都集中在 Azure FS 上),我努力解决
为 Client 和 Relying party 提供给 ADFS 的值是如何映射的
到代码中使用的值。
在代码中使用什么 ADFS endpoint/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).
这就是我找到要使用的端点的方式:
- ADFS 在“https://sts.domain.com/federationmetadata/2007-06/federationmetadata.xml”发布联合元数据
- 提取此文件并在文本编辑器中打开。
- 配置依赖方时,我们在指定资源端点时指定了"Enable Support for WS-Federation Passive Protocol",因此在XML中搜索
PassiveRequestorEndpoint
。
- 使用此节点的
<Address>
- 在我的例子中是 https://sts.domain.com/adfs/ls/
。我不知道这是否永远是值,或者它是否在设置 ADFS 时指定,因此每个站点可能不同。
要在代码中使用哪些其他值?
我们希望我们的客户端应用程序从 ADFS 检索一个 JSON Web 令牌 (JWT),我们可以将其传递给我们的受保护资源以用于 authentication/authorization 目的。
最简单的是,访问令牌可以通过 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;
有用的参考资料
我有一个 .NET 4.6.2 Windows 客户端应用程序,它需要从我们的本地 ADFS 服务器获取身份验证令牌并使用它来调用 ASP.NET Core REST API.它的客户端名称、ID (GUID) 和重定向 URI 已在 ADFS 中注册。我正在使用最新的 ADAL (v3.13) 库来促进身份验证。我正在尝试获取令牌,如 ADAL 示例代码中所示:
AuthenticationContext authenticationContext = new AuthenticationContext("https://<adfs-sts-server>/<rest-api-host>", false);
var result = authenticationContext.AcquireTokenAsync(<rest-api-resource-uri>, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto));
AcquireTokenAsync
调用 returns 出错,提示:基于浏览器的身份验证对话框未能完成。原因:服务器未找到与请求的 URI(统一资源标识符)匹配的任何内容。
谁能告诉我:
- 错误中引用的 "requested URI" 是
https://<adfs-sts-server>/<rest-api-host>
还是<rest-api-resource-uri>
? - 我是否需要以某种方式向 ADFS 注册
<rest-api-host>
或<rest-api-resource-uri>
,如果需要,如何注册? - 我需要任何其他信息才能让它工作吗?
谢谢! 彼得
根据 asdf 的版本,您可以使用 'discovery' 获取要使用的端点。
查看此 post 了解更多详情:http://www.cloudidentity.com/blog/2015/08/21/openid-connect-web-sign-on-with-adfs-in-windows-server-2016-tp3/
要为 Web API 颁发令牌,我们需要通过为 Web API 创建依赖方信任让 ADFS 知道它。当我们添加回复方时,我们需要指定回复方的标识符,如下图(Windows Server 2012 R2):
然后我们可以使用这个标识符作为资源URI来获取这个回复方的令牌。如上图配置请确保资源URI正确
这是一篇关于使用 OAuth 使用 ADFS 进行开发的文章:
Developing Modern Applications using OAuth and Active Directory Federation Services
使用 Active Directory 联合身份验证服务 (ADFS) 为来自 Windows 客户端的本地端点提供身份验证
配置 ADFS
配置 ADFS 分为两部分。
向 ADFS 注册客户端应用程序
ADFS 需要能够识别请求用户身份验证的应用程序,无论它是服务、WPF 应用程序、Web 客户端还是 Office 加载项。我已经通用并添加了以下客户端,我们可以将其用于大多数 C# 请求;我们可能需要为 Web 客户端注册一个具有不同回调的新客户端。
使用众多工具之一为客户端 ID 生成 GUID。
* CLIENT_ID 和 APP_NAME 应该是唯一的。
* 对于 Web 客户端,重定向 URI 是身份验证服务在对用户进行身份验证后重定向您的呼叫的位置。它应该是一个端点,您可以在其中处理令牌并继续您的客户端应用程序。重定向 URI 并没有真正与 rich clients/services/add-ins 一起使用。
CLIENT_ID = 26E54EC9-7988-4DAE-A527-483A8A78B1C6
APP_NAME = Investplus
DESCRIPTION = Invest+ rich client suite
REDIRECT_URI = https://server/redirect-adfs.html
客户注册说明
(在向导中可能可行,但这是我在网上找到的并且对我们有用)
- 以管理员身份登录到 AD FS 服务器并打开 Windows PowerShell 命令 window。
输入以下命令。在 Windows PowerShell
Add-AdfsClient -ClientId <CLIENT_ID> -Name <APP_NAME> -RedirectUri <REDIRECT_URI>
注册要访问的资源('Relying Party' 在 ADFS 中的说法)
我发现 this link 很有用,它会引导您完成设置依赖方的向导步骤。
依赖方注册说明服务器团队的管理员将需要使用 ADFS 添加依赖方信任向导,并在 "Select Data Source" 步骤下 select 手动输入有关依赖方的数据。
您需要为该向导提供的值:
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
Configuring/Coding 客户端应用程序
Microsoft 为从 C# 到 Javascript,从 iOS 到 Cordova 到 Node.
的一系列平台和语言提供 Active Directory Authentication Libraries (ADAL)所暴露的API在每个主要版本中都发生了显着变化:我使用的是最新的C#库,目前是3.13.5。
该库使编码非常简单,几行代码;我遇到问题的地方是:
- 我找不到关于 URL 用于 ADFS 的解释 安全令牌服务 (STS)
- 我在这里找不到整个过程的文档(大多数文档都集中在 Azure FS 上),我努力解决 为 Client 和 Relying party 提供给 ADFS 的值是如何映射的 到代码中使用的值。
在代码中使用什么 ADFS endpoint/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).
这就是我找到要使用的端点的方式:
- ADFS 在“https://sts.domain.com/federationmetadata/2007-06/federationmetadata.xml”发布联合元数据
- 提取此文件并在文本编辑器中打开。
- 配置依赖方时,我们在指定资源端点时指定了"Enable Support for WS-Federation Passive Protocol",因此在XML中搜索
PassiveRequestorEndpoint
。 - 使用此节点的
<Address>
- 在我的例子中是https://sts.domain.com/adfs/ls/
。我不知道这是否永远是值,或者它是否在设置 ADFS 时指定,因此每个站点可能不同。
要在代码中使用哪些其他值?
我们希望我们的客户端应用程序从 ADFS 检索一个 JSON Web 令牌 (JWT),我们可以将其传递给我们的受保护资源以用于 authentication/authorization 目的。
最简单的是,访问令牌可以通过 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;