【问题标题】:Making requests to Azure Management向 Azure 管理发出请求
【发布时间】:2019-08-17 18:32:03
【问题描述】:

我已经完成了向我的应用程序添加 Azure AD 身份验证的指南:

https://azure.microsoft.com/en-gb/resources/samples/active-directory-dotnet-webapp-openidconnect-aspnetcore/

并且可以成功登录,拥有服务主体,一切都按预期工作。

我现在想以用户身份发出 Web 请求,但看不到如何获取要在请求中发送的身份验证详细信息,我尝试查看 ClaimsPrincipal.Current 对象,但我无法通过向 HTTP 客户端发出请求。

【问题讨论】:

  • 您需要代表已登录用户的访问令牌。看看这个线程,它显示了几个例子 - stackoverflow.com/a/51061426/1538039。获得可用的访问令牌后,您可以使用 Authorization 将其传递给 HTTP 请求:bearer {token}

标签: asp.net-core azure-active-directory razor-pages


【解决方案1】:

您引用的示例 Web 应用程序仅让用户登录,但您需要代表该用户获取访问令牌才能访问 api。

你可以参考这个sample。这个示例调用了另一个webapi,你可以忽略那部分,只需将资源更改为https://management.core.windows.net/

    public void Configure(string name, OpenIdConnectOptions options)
    {
        options.ClientId = _azureOptions.ClientId;
        options.Authority = _azureOptions.Authority;
        options.UseTokenLifetime = true;
        options.CallbackPath = _azureOptions.CallbackPath;
        options.RequireHttpsMetadata = false;
        options.ClientSecret = _azureOptions.ClientSecret;
        options.Resource = "https://management.core.windows.net/"; // management api
        options.ResponseType = "id_token code";

        // Subscribing to the OIDC events
        options.Events.OnAuthorizationCodeReceived = OnAuthorizationCodeReceived;
        options.Events.OnAuthenticationFailed = OnAuthenticationFailed;
    }

    private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
    {
        // Acquire a Token for the management API 
        string userObjectId = (context.Principal.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;
        var authContext = new AuthenticationContext(context.Options.Authority, new NaiveSessionCache(userObjectId, context.HttpContext.Session));
        var credential = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret);
        var authResult = await authContext.AcquireTokenAsync(context.Options.Resource,credential);
        // Notify the OIDC middleware that we already took care of code redemption.
        context.HandleCodeRedemption(authResult.AccessToken, context.ProtocolMessage.IdToken);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2017-11-20
    • 2020-10-12
    • 2021-10-19
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多