【问题标题】:Access website API from daemon using Azure AD使用 Azure AD 从守护程序访问网站 API
【发布时间】:2020-03-04 03:36:35
【问题描述】:

我们创建了一个 ASP.net Core 网站并向其中添加了一个我们需要从守护进程访问的 API。该网站由 Azure AD 保护,守护程序通过 Azure 进行身份验证。在守护进程中,我使用站点用于获取令牌的相同应用程序凭据,但是当我尝试使用令牌访问网站 API 时,我被重定向到 Microsoft 登录页面。我不确定我错过了什么。我正在获取访问令牌。

在使用下面的 HttpClient 代码之前,我还尝试按照 https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-daemon-app-configuration?tabs=dotnet 的说明进行操作。

using (var _client = new HttpClient())
{
    var Content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("grant_type", "client_credentials"),
        new KeyValuePair<string, string>("client_id", ClientID),
        new KeyValuePair<string, string>("client_secret", ClientSecret)
    });

    var Response = await 
    _client.PostAsync($"https://login.microsoftonline.com/[tenantUUID]/oauth2/token", Content);
    if (Response.IsSuccessStatusCode) 
    { 
        var Token = JsonConvert.DeserializeObject<Data.Token>(await Response.Content.ReadAsStringAsync());

        Console.WriteLine("AccessToken: " + Token.access_token);

        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token.access_token);

        Response = await _client.GetAsync("https://localhost:44318/api/notify");
        Console.Write(await Response.Content.ReadAsStringAsync());
    }
}

【问题讨论】:

  • 你拿到token成功了吗?
  • 是的。我可以在控制台上显示它。
  • 你有没有提到github.com/Azure-Samples/…
  • @JimXu 我想我有,但会再看看

标签: c# asp.net-core azure-active-directory


【解决方案1】:

经过更多搜索后,我发现我遇到了两个问题:网站未设置为接受 Azure AD 令牌,并且某些原因导致我的 HttpClient 代码未请求正确的信息。

为了将站点设置为接受 Azure AD 令牌,我更改了我的 startup.cs 文件,因此 services.AddAuthentication 部分现在显示为:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options))
    .AddAzureADBearer(options => Configuration.Bind("AzureAd", options)); 

这仅允许一种默认身份验证方法起作用,因此用户登录起作用或承载起作用取决于AzureADDefaults 的设置。你可以指定使用哪一个,就像我在我的 API 上做的那样,通过装饰类:

[Authorize(AuthenticationSchemes = AzureADDefaults.BearerAuthenticationScheme)]

这在 ASP.net 2.2 中被破坏,但应该在 3.0 中工作(根据我阅读的内容)。要解决它,请将其更改为:

[Authorize(AuthenticationSchemes = "AzureADBearer")]

如果要允许不记名令牌和正常登录,请在字符串中添加AzureAD

[Authorize(AuthenticationSchemes = "AzureADBearer, AzureAD")]

至于 HttpClient 问题,我不确定出了什么问题,但我也切换回 Microsoft 的代码并使用 ConfidentialClientApplication 构建请求并获取令牌,它现在可以正常工作,同时 startup.cs 更改.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多