使用AutoRest C#客户端访问带有承载令牌的Web API - TokenCredentials不起作用

时间:2017-07-11 15:18:13

标签: c# asp.net-web-api adal bearer-token autorest

编辑10/24 我认为这很可能是用户错误 - 在深入研究这个问题之前,请参阅下面的答案以获得补救

TL; DR: 对于我的OAuth 2.0代码流程......

  

为什么我的TokenCredentials无法与我的AutoRest客户端一起使用?   我没有应用于请求/没有授权标头集的承载令牌

我知道我的管道已经工作了......

使用this azure sample中不是AutoRest客户端的代码,我可以成功获取access_token并可以从受保护的Web API项目中获取JSON ..所以我排除了所有先决条件东西..我知道我的管道工作

我的自动重启设置..

1。)从GitHub this AutoRest repo v1.1.0

下载

2.。)将我的招摇JSON下载到磁盘,保存为swagger.json

3。)运行此命令行以生成C#文件:

autorest --input-file=swagger.json --csharp --output-folder=MyCorp_ApiClient_Tsl --namespace='MyCorp.ApiClient' --add-credentials

4.。)将生成的类复制到我的.NET 4.6.2网站

5.)这些是我的NuGets:

- Microsoft.Rest.ClientRuntime version="2.3.8" 
- Microsoft.Rest.ClientRuntime.Azure.Authentication version="2.3.1" 
- Microsoft.IdentityModel.Clients.ActiveDirectory version="2.28.3" 

这是什么不起作用:

   AdalTokenHelper tokenHelper = new AdalTokenHelper();//helper code further below

    string token = await tokenHelper.GetTokenString();
    var svcClientCreds = new TokenCredentials(token, "Bearer");

    client = new MyCorp.ApiClient(new Uri(apiRsrcUrl), svcClientCreds, 
    new DelegatingHandler[] { new MyAzureTracingHandler() });

    //make call to OData controller...        
    MyCorp.ApiClient.Models.ODataResponseListStatus statusList = await client.Status.GetStatusAsync(expand: "StatusType",cancellationToken: defaultCancelThreadToken);

    return View(statusList.Value);

我尝试过以上的变体,使用TokenCredentials的不同ctor,但无论如何,我可以将我的断点放在MyAzureTracingHandler中并看到请求没有应用授权标头..所以我得到预期的401 Unauthorized回复。

如果我修改MyAzureTracingHandler以接受我的TokenCredentials实例,那么我可以强制请求应用相应的不记名令牌。

这有效,但是,感觉很糟糕:

我从此处更改了原始客户端实例化代码段:

 client = new ApiClient(new Uri(apiRsrcUrl), svcClientCreds, 
 new DelegatingHandler[] { new MyAzureTracingHandler() });

对此:

 client = new ApiClient(new Uri(apiRsrcUrl), svcClientCreds, 
 new DelegatingHandler[] { new MyAzureTracingHandler(svcClientCreds) });

SendAsync的{​​{1}}方法中我执行此操作:

MyAzureTracingHander

我做错了吗?我认为在实例化我的客户端时我不应该两次传递await svcClientCreds.ProcessHttpRequestAsync(request, cancellationToken);

附录A - 通过ADAL获取访问令牌:

ServiceClientCredentials

1 个答案:

答案 0 :(得分:0)

虽然我相信我使用<Grid Grid.Row="1" Background="Purple" > <Grid> <Grid.ColumnDefinitions> <ColumnDefinition SharedSizeGroup="Labels" Width="Auto" /> <ColumnDefinition SharedSizeGroup="InputControls" Width="*" /> </Grid.ColumnDefinitions> </Grid> <ItemsControl ItemsSource="{Binding SelectedBarcodeTemplate.Fields}" Background="Yellow" Grid.IsSharedSizeScope="True"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Background="Green" ShowGridLines="True"> <Grid.ColumnDefinitions> <ColumnDefinition SharedSizeGroup="Labels"/> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Path=Label}" Grid.Column="0" Margin="5" VerticalAlignment="Center"/> <TextBox Text="{Binding Path=Name}" Grid.Column="1" Margin="5" VerticalAlignment="Center" HorizontalAlignment="Stretch"/> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> 运行了autorest命令,但我可能使用了较旧的语法... --add-credentials

我也没有按照文档推荐的那样运行--AddCredentials true

其中一个是罪魁祸首,因为现在我的1.1.0 autorest安装正确地生成了所有内容。