Pet*_*ter 6 c# adfs adal asp.net-core
我有一个.NET 4.6.2 Windows客户端应用程序,它需要从我们的内部部署ADFS服务器获取身份验证令牌,并使用它来调用ASP.NET核心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));
Run Code Online (Sandbox Code Playgroud)
该AcquireTokenAsync调用返回错误,说:基于浏览器的身份验证对话框无法完成.原因:服务器未找到与请求的URI(统一资源标识符)匹配的任何内容.
谁能告诉我:
https://<adfs-sts-server>/<rest-api-host>或<rest-api-resource-uri>?<rest-api-host>或<rest-api-resource-uri>使用ADFS,如果是这样的话?谢谢!彼得
Pet*_*ter 11
配置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
Run Code Online (Sandbox Code Playgroud)
客户注册说明
(可能在向导中,但这是我在网上发现的,它对我们起作用)
输入以下命令.在Windows PowerShell中
Add-AdfsClient -ClientId <CLIENT_ID> -Name <APP_NAME> -RedirectUri <REDIRECT_URI>
我发现此链接很有用,它会引导您完成向导的步骤以设置依赖方.
依赖方注册说明服务器团队的管理员需要使用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
Run Code Online (Sandbox Code Playgroud)
如果有机会,请添加声明规则:
SEND_LDAP_ATTRIBUTES_AS_CLAIMS = true
ATTRIBUTE_STORE = Active Directory
SELECT_USEFUL_ATTRIBUTES = User-Principal-Name; Email; Display-Name
Run Code Online (Sandbox Code Playgroud)
Microsoft为从C#到Javascript,从iOS到Cordova到Node的各种平台和语言提供Active Directory身份验证库(ADAL).
暴露的API在每个主要版本中都发生了显着变化:我使用的是最新的C#库,目前是3.13.5.
该库使编码非常简单,只需几行; 我遇到问题的地方是:
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).
Run Code Online (Sandbox Code Playgroud)
这就是我找到要使用的端点的方式:
PassiveRequestorEndpoint.<Address>在我的例子中使用from this节点https://sts.domain.com/adfs/ls/.我不知道这是否总是值,或者是否在设置ADFS时指定,因此每个站点可能有所不同.我们希望我们的客户端应用程序从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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6115 次 |
| 最近记录: |