编辑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
答案 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安装正确地生成了所有内容。