【问题标题】:Call Azure AD protected Azure Function from console app/PowerShell w/delegated permission从具有委托权限的控制台应用程序/PowerShell 调用受 Azure AD 保护的 Azure 函数
【发布时间】:2020-05-11 07:12:49
【问题描述】:

我想做的是让用户在他们的 Windows 桌面计算机上登录到 AAD 提示符,这样我就得到了一个可以与我的 Azure 函数一起使用的 Bearer 令牌。

我已按照this article on adatum 的教程进行操作,但它仅涵盖应用程序权限(不包括委派权限)

  • 我已经有一个为 Azure AD 设置的 Azure 函数 验证。
  • 我已经有一个我注册的客户端应用程序(在 应用程序注册)。
    • 我已将其配置为使用委派权限 用于 Azure 函数。

这是我的客户端代码:

var clientId = "client id for my console app";//console app
var clientUrl = new Uri("https://login.microsoftonline.com/common/oauth2/nativeclient");  
var tenant = "tenantid here";
string authority = "https://login.windows.net/" + tenant;

string resource = "https://myaadProtectedFunc.azurewebsites.net";  

AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);

var pp = new PlatformParameters(PromptBehavior.Auto);
var token = authenticationContext.AcquireTokenAsync(resource, clientId, clientUrl, 
    pp, UserIdentifier.AnyUser).Result;
Console.WriteLine("Got the token: {0}", token.AccessToken);

我收到一条错误消息,提示“[我的客户端应用程序] 需要访问您组织中只有管理员才能授予的资源的权限。请让管理员授予此应用程序的权限,然后您才能使用它。”

是否有其他方法可以获取适用于我的 Azure Function 的 Bearer 令牌?

【问题讨论】:

    标签: c# powershell azure-functions adal


    【解决方案1】:

    我进行了测试,如果您正确设置了 azure 端,您的代码确实可以工作。很可能在 azure 函数中您没有正确设置它。

    您是否在 azure 函数中设置了服务主体? 例如。功能应用 -> 平台功能 -> 身份验证/授权 -> 应用服务身份验证为 ON -> 选择 azure Active Directory -> express -> 创建。 -> 按确定。 -> 保存。

    然后在您的应用注册中,您现在将看到 2. 用于您的客户端的应用注册,以及用于您的函数应用的应用注册。在您的客户端的应用程序注册中,转到 api 权限并为您的函数应用程序添加应用程序注册,并选择用户模拟。

    最后确保您的企业应用程序具有您希望被允许访问每个企业应用程序的用户/组。 (客户端和函数应用注册)

    希望对您有所帮助。

    【讨论】:

    • 谢谢,我确认我有正确的应用注册并正确设置了应用服务身份验证。我可以通过浏览器很好地访问我的 Azure Function,我只想在控制台应用程序中执行此操作。
    • 我通过一个使用 c# 和 .net 4.7.2 的新控制台应用程序进行了尝试。它似乎奏效了。您提到您设置了应用程序注册和应用程序服务身份验证。您是否也对应用注册应用了正确的 API 权限?例如客户端应用注册 -> API 权限 -> 添加权限 -> 我的组织使用的 API -> yourserviceappname -> user_impersonation?
    • 感谢您的帮助,我终于找到了另一种不需要注册单独的客户端应用程序的方法。
    【解决方案2】:

    好吧,事实证明我根本不需要制作单独的客户端应用程序。

    我可以只使用 Azure Function 的客户端 ID。

    问题是您必须转到“Advance”而不是“Express”,因为库 Microsoft.Identity.Client 使用 v2.0 令牌。

    这是为了配置您的 Azure 函数 - 保持所有字段相同,但在颁发者 URL 中添加 /v2.0:

    这是获取 Azure Function 的委托不记名令牌的代码,它使用 v2.0 令牌 - 我不知道如何将其更改为使用 v1 令牌:

    string[] scopes = new string[] { "profile", "email", "openid" };
    string ClientId = [clientId of Azure Function];
    string Tenant = [tenantId];
    string Instance = "https://login.microsoftonline.com/";
    var _clientApp = PublicClientApplicationBuilder.Create(ClientId)
        .WithAuthority($"{Instance}{Tenant}")
        .WithDefaultRedirectUri()
        .Build();
    var accounts = _clientApp.GetAccountsAsync().Result;
    
    var authResult = _clientApp.AcquireTokenInteractive(scopes)
                .WithAccount(accounts.FirstOrDefault())
                .WithPrompt(Prompt.SelectAccount)
                .ExecuteAsync().Result;
    var bearerTokenForAzureFunction = authResult.IdToken;
    

    现在,如果我可以通过这种方式获得委托的不记名令牌,我根本不了解需要注册客户端应用程序...

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多