代码之家  ›  专栏  ›  技术社区  ›  Peter

如何设置有效的本地ADFS URI?

  •  6
  • Peter  · 技术社区  · 8 年前

    我有一个.NET 4.6.2 Windows客户端应用程序,需要从我们的本地ADFS服务器获取身份验证令牌,并使用它调用ASP。NET是RESTAPI的核心。它的客户端名称、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 调用返回一个错误,表示: 基于浏览器的身份验证对话框未能完成。原因:服务器未找到与请求的URI(统一资源标识符)匹配的任何内容。

    谁能告诉我:

    1. 错误中是否引用了“请求的URI” https://<adfs-sts-server>/<rest-api-host> <rest-api-resource-uri> ?
    2. 我需要注册吗 <rest-api-host> <rest api资源uri>
    3. 我需要什么其他信息才能让这个工作?

    谢谢 彼得

    3 回复  |  直到 8 年前
        1
  •  12
  •   Peter    8 年前

    使用Active Directory联合身份验证服务(ADFS)从Windows客户端为本地端点提供身份验证

    配置ADF

    配置ADFS有两个部分。

    向ADFS注册客户端应用程序

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

    使用多种工具之一为客户端ID生成GUID。
    *CLIENT_ID和APP_NAME应该是唯一的。 *对于web客户端,重定向URI是身份验证服务在验证用户后重定向调用的位置。它应该是一个端点,您可以在其中处理令牌并继续使用客户端应用程序。重定向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 <CLIENT_ID> -Name <APP_NAME> -RedirectUri <REDIRECT_URI>

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

    我发现 this link 非常有用,它将引导您完成向导中设置依赖方的步骤。

    服务器团队的管理员将需要使用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
    

    微软提供 Active Directory Authentication Libraries (ADAL)适用于一系列平台和语言,从C#到Javascript,从iOS到Cordova到Node。

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

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

    1. 我找不到关于ADFS使用什么URL的解释 安全令牌服务(STS)
    2. 我在这里找不到整个过程的文档(大多数文档集中在Azure FS上),我很难找到 提供给ADFS的值如何: 依赖方 映射 设置为代码中使用的值。

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

    Microsoft的最佳做法是命名ADFS/STS服务器URL https://sts.domain.com (有些人使用 https://adfs.domain.com 或者,询问服务器管理员)。然而,如果您尝试从浏览器中点击此项,您将得到 404 - Not found

     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被动协议的支持”,因此搜索XML PassiveRequestorEndpoint .
    3. 使用 <Address> 从这个节点-在我的例子中 https://sts.domain.com/adfs/ls/ .我不知道这是否始终是值,或者是否在设置ADFS时指定,因此每个站点可能不同。

    在代码中使用哪些其他值?

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

    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;
    

    有用的参考资料

        2
  •  2
  •   Fei Xue    8 年前

    要为web API发布令牌,我们需要通过为web API创建依赖方信任来让ADF知道它。当我们添加回复方时,我们需要为回复方指定标识符,如下图所示(Windows Server 2012 R2): enter image description here

    然后,我们可以使用这些标识符作为资源URI来获取这个应答方的令牌。请确保资源URI在配置时正确,如上图所示。

    下面是一篇关于使用OAuth开发ADFS的文章:

    Developing Modern Applications using OAuth and Active Directory Federation Services

        3
  •  0
  •   Brent Schmaltz    8 年前

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

    更多详情,请查看这篇文章: http://www.cloudidentity.com/blog/2015/08/21/openid-connect-web-sign-on-with-adfs-in-windows-server-2016-tp3/