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

时间:2016-10-10 15:42:52

标签: c# asp.net-core adfs adal

我有一个.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调用返回错误,说:基于浏览器的身份验证对话框无法完成。原因:服务器未找到与请求的URI(统一资源标识符)匹配的任何内容。

任何人都可以告诉我:

  1. 是&#34;请求的URI&#34;错误引用了https://<adfs-sts-server>/<rest-api-host><rest-api-resource-uri>
  2. 我是否需要以某种方式向ADFS注册<rest-api-host><rest-api-resource-uri>,若然,又如何?
  3. 我需要的其他任何信息才能让它发挥作用吗?
  4. 谢谢! 彼得

3 个答案:

答案 0 :(得分:9)

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

配置ADFS

配置ADFS有两个部分。

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

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

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

  3. 注册要访问的资源(&#39;依赖方&#39;在ADFS中发言)

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

    依赖方注册说明

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

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

    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为一系列平台和语言提供Active Directory Authentication Libraries(ADAL),从C#到Javascript,从iOS到Cordova再到Node。

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

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

    1. 我无法找到用于ADFS的URL的说明 安全令牌服务(STS)
    2. 我无法找到整个过程的文档,就像我在这里所做的那样(大多数文档都集中在Azure FS上),我努力工作 如何为客户端依赖方映射的ADFS提供的值 代码中使用的值。
    3. 代码中使用的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在&#39; https://sts.domain.com/federationmetadata/2007-06/federationmetadata.xml&#39;上发布联盟元数据。
        • 提取此文件并在文本编辑器中打开。
      2. 配置依赖方时,我们指定了#34;启用对WS-Federation Passive Protocol的支持&#34;在指定我们的资源端点时,请在XML中搜索PassiveRequestorEndpoint
      3. 使用此节点中的<Address> - 在我的情况下https://sts.domain.com/adfs/ls/。我不知道这是否总是值,或者是否在设置ADFS时指定,因此每个站点可能有所不同。
      4. 代码中还有哪些其他值?

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

        最简单的是,可以在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;
        

        有用的参考资料

答案 1 :(得分:2)

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

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

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

Developing Modern Applications using OAuth and Active Directory Federation Services

答案 2 :(得分:0)

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

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