从具有授权权限的控制台应用程序/ PowerShell调用受Azure AD保护的Azure功能

时间:2020-05-09 17:03:56

标签: c# powershell azure-functions adal

我想要做的是让用户登录其Windows桌面计算机上的AAD提示符,因此我获得了一个Bearer令牌,该令牌将与我的Azure函数一起使用。

我已经按照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函数一起使用的Bearer令牌吗?

2 个答案:

答案 0 :(得分:1)

我进行了测试,如果正确设置了天蓝色面,则您的代码可以正常工作。最可能是在天蓝色函数中没有正确设置它。

在azure函数中,您是否设置了服务主体? 例如。功能app->平台功能->身份验证/授权-> App Service Authentication设置为ON->选择Azure活动目录-> express->创建。 ->按确定。 ->保存。

然后在您的应用程序注册中,您现在将看到2.客户的应用程序注册和功能应用程序的应用程序注册。在客户端的应用程序注册表中,转到api权限,然后为功能应用程序添加应用程序注册,并选择用户模拟。

最后确保您的企业应用程序具有要允许每个企业应用程序访问的用户/组。 (客户端和功能应用程序注册)

希望有帮助。

答案 1 :(得分:0)

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

我只能使用Azure功能的客户端ID。

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

这是为了配置您的Azure功能-保持所有字段相同,但是将/v2.0添加到Issuer URL: Choose Advanced

这是获取使用v2.0令牌的Azure函数的委托承载令牌的代码-我不知道如何更改为使用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;

现在,如果我能以这种方式获得委托的承载令牌,我根本就不需要注册客户端应用程序...