CSharp - C# 如何使用Azure活动目录授权来消费 Azure REST API 应用

  显示原文与译文双语对照的内容

我已经向Azure部署了一个 API App,但如果身份验证( 用 AAD ) 设置为 is,则创建API客户机。

当我尝试生成服务客户端( 禁用身份验证时) 时,生成客户端代码并在代码正常运行,但是当我在请求时( 以及在请求未被验证时采取的操作) 被设置为, Login with Azure Active Directory ),

1 ) 返回 401 Unauthorized ( 不重定向到和登录页面)的服务调用

2 ) 然后我尝试再次生成服务客户端( 在project项目菜单 of> 添加-> REST API 客户端->,然后在对话框中选择"选择Azure资产,按下确定并得到消息 "Failed to download metadata file for Microsoft Azure API App:.. .app name..." ( 和"没有可用的附加信息")

我正在根据这个Azure手动( 使用快速设置) 实现 AAD:

https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/

根据这个视频工作,和这个视频中所显示的东西都是工作的,除了。没有演示。 对我来说,它不工作。

https://azure.microsoft.com/en-us/documentation/videos/connect-2015-what-s-new-in-app-service-api-apps/

建议

编辑

如果我在网络浏览器中输入请求 url ( REST API 客户端使用的) - 然后它返回有效结果( 我发现在这个情况下应该使用 REST API ) I 我想应该在这个例子中显示。 但它不是

编辑2

我得到了一些进度- 到了:登录屏幕,但输入凭据后获得 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活动目录中注册了我的客户端应用程序

2 ) 当从客户端应用程序调用 REST API 时,我正在添加 ServiceClientCredentials

3 ) 创建ServiceClientCredentials时,我提供 4元素 -authority = 这是来自应用程序注册-> 端点=> 联合元数据文档 vērtība ( 没有起始部分 http://login.windows.net/ )

-resource => 这是 REST API uri ( = 作为请求令牌的收件人的目标资源的> 标识符)

-clientId => 这是我在 -redirect Uri => 中注册客户端应用程序后得到的应用程序,。

如何在客户端应用程序中指定这里资源?

client has not specified this resource in its requiredResourceAccess list

时间: 原作者:

我在如何启用和授权 Azure REST API 应用程序方面找到了一个解决方案。 如果有人有同样的挑战,我希望这将有帮助。

这些是我做的步骤

1 ) 在应用程序服务-> 身份验证/授权

  • 应用程序服务身份验证=>
  • 当请求未被验证时采取的操作=> 登录
  • 已经配置并带有快速设置( 在那里你必须为你的API应用程序创建Azure广告应用程序- 换句话说,"应用注册"为你的服务注册"

2 ) 在Azure活动目录-> 应用注册

  • 为你的客户端应用程序添加注册
  • requiredResourceAccess 应用程序中编辑客户端应用程序- 在部分中,必须添加有关 REST API 应用程序的信息:
    • resourceAppId -> 在这里插入 REST API APP ID
    • ( 你可以在api的REST清单中获取它的resourceAccess {id}> OauthPermission id值)

3 ) 在客户端应用程序中

  • 使用 Autorest 生成你的REST客户端( 从解决方案资源管理器: AddREST API client ) 或者手动创建
  • 添加 Microsoft.IdentityModel.Clients.ActiveDirectory nuget包
  • 获取和使用令牌以类似于下面的代码访问你的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);
    
    
    }
    
    
    
    
原作者:
...