我已经将API App
部署到Azure,但是如果身份验证(使用AAD)设置为ON,则我在创建API客户端时遇到问题。
当我尝试生成服务客户端(当身份验证是OFF),然后生成客户端代码(它是用Autorest完成的)和代码正在工作,但是当我切换身份验证ON(和请求未经过身份验证时采取的行动设置为Login with Azure Active Directory
),然后
1)业务呼叫返回401 Unauthorized
(未重定向到AAD登录页面)
2)然后我尝试再次生成服务客户端(从项目的上下文菜单->添加-> REST API客户端->然后在对话框中我选择"选择Azure资产"并按下确定,并得到一个消息"Failed to download metadata file for Microsoft Azure API App: ...app name..."
(和"没有额外的信息可用")
我是根据这个Azure手册实现AAD的(使用express设置):
https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/是根据这个视频工作,太和一切在这个视频中显示的工作,除了AAD没有演示…对我来说,这是行不通的…
https://azure.microsoft.com/en——us/documentation/videos/connect - 2015 - s -新- -应用程序-服务- api - apps/
有什么建议吗?
编辑
1)如果我在web浏览器中输入请求url (REST API客户端使用)-然后它返回有效的结果2)我发现我正在使用没有凭据的REST API(我认为Azure AD登录屏幕应该在这种情况下呈现…但它不是)
编辑2
我得到了一些进展-得到了AAD登录屏幕,但在输入凭据后,我得到了bearer token
,但当我试图查询服务时,我得到一个错误消息:
AADSTS65005: The client application has requested access to resource 'https....azurewebsites.net'. This request has failed because the client has not specified this resource in its requiredResourceAccess list.
Trace ID: 4176e...
Correlation ID: 1d612d...
Timestamp: 2016-11-13 18:28:34Z
到目前为止,我已经完成了这些步骤:
0)添加Microsoft.IdentityModel.Clients.ActiveDirectory nuget包到客户端项目
1)在Azure Active Directory中注册我的客户端应用程序
2)当从客户端应用程序调用REST API时,我添加了ServiceClientCredentials
3)当创建ServiceClientCredentials时,我提供了4个元素-authority =这是来自AAD App注册-> Endpoints => Federation元数据文档vērtība(不含起始部分http://login.windows.net/
)
-resource =>这是REST API uri(=>目标资源的标识符,即所请求令牌的接收者)
-clientId =>这是我在AAD注册客户端应用程序后得到的应用程序id-redirect Uri =>由于我的客户端应用程序是一个本机应用程序,那么这只是任何有效的url
如何在客户端应用程序中指定此资源?
client has not specified this resource in its requiredResourceAccess list
我设法找到了一个解决方案,如何启用AAD授权Azure REST API应用程序。以防有人有同样的挑战,我希望这将是有帮助的。
以下是我所做的步骤:
1)在App服务中->认证/授权
- App Service Authentication => On
- 请求未通过身份验证时采取的操作=>使用AAD登录
- 配置AAD与快速设置(在那里你必须创建AzureAD应用程序为您的API应用程序-即。"应用程序注册"为您的服务)
2)在Azure Active Directory -> App注册
- 为您的客户端应用程序添加注册 编辑你的客户端应用程序的Manifest -在
-
resourceAppId
->在这里插入REST API应用程序id -
resourceAccess {id}
-> OauthPermission id值的REST API(你可以得到它在REST API的清单!)
requiredResourceAccess
部分你必须添加关于REST API应用程序的信息:3)在客户端应用程序
- 使用
Autorest
(从解决方案资源管理器:AddREST API client
)生成您的REST客户端或手动创建 - add
Microsoft.IdentityModel.Clients.ActiveDirectory
nuget pack -
获取并使用令牌访问API,代码类似如下:
//request (..) var tokenCreds = getToken(); ServiceClientCredentials credentials = tokenCreds; using (var client = new YourAPI(credentials)) { ... } (..) //getting token private static TokenCredentials getToken() { //get this from Federation Metadata Document in //Azure Active Directory App registrations -> Endpoints var authority = "f1..."; //Identifier of the target resource that is the recipient of the requested token var resource = "https://yourapi.azurewebsites.net"; //client application id (see Azure Active Directory App registration //for your client app var clientId = "a71..."; //return url - not relevant for Native apps (just has to be valid url) var redirectUri = "https://just-some-valid-url.net"; AuthenticationContext authContext = new AuthenticationContext(string.Format ("https://login.windows.net/{0}", authority)); AuthenticationResult tokenAuthResult = authContext.AcquireTokenAsync(resource, clientId, new Uri(redirectUri), new PlatformParameters(PromptBehavior.Auto)).Result; return new TokenCredentials(tokenAuthResult.AccessToken); }