我已向Azure部署API App
,但如果身份验证(使用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:
根据这个视频也正在工作,这个视频中显示的所有内容都在工作,除了AAD没有被证明......对我来说它不起作用......
有什么建议吗?
修改
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 pack添加到客户端项目
1)在Azure Active Directory中注册了我的客户端应用程序
2)从客户端应用程序调用REST API时,我正在添加ServiceClientCredentials
3)创建ServiceClientCredentials时,我提供了4个元素
-authority =这是来自AAD App注册 - >端点=>联邦元数据文档vērtība(没有起始部分http://login.windows.net/
)
-resource =>这是REST API uri(=>作为请求令牌的接收者的目标资源的标识符)
-clientId =>这是我在AAD注册客户端应用程序后得到的应用程序ID -redirect Uri =>由于我的客户端应用程序是Native应用程序,因此这只是任何有效的URL
如何在我的客户端应用中指定此资源?
client has not specified this resource in its requiredResourceAccess list
答案 0 :(得分:1)
我设法找到了如何为Azure REST API App启用AAD授权的解决方案。如果有人遇到同样的挑战,我希望这会有所帮助。
以下是我采取的措施:
1)在App服务中 - >认证/授权
2)在Azure Active Directory中 - >应用注册
requiredResourceAccess
部分中,您必须添加有关REST API应用程序的信息:
resourceAppId
- >在此处插入REST API App id resourceAccess {id}
- > REST API的OauthPermission id值(您可以在REST API的清单中获取它!)3)在您的客户端应用程序中
Autorest
生成您的REST客户端(来自解决方案资源管理器:Add\REST API client
)或手动创建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);
}