C# 从控制台应用程序/PowerShell调用Azure AD保护的Azure函数,并具有委派权限

C# 从控制台应用程序/PowerShell调用Azure AD保护的Azure函数,并具有委派权限,c#,powershell,azure-functions,adal,C#,Powershell,Azure Functions,Adal,我想做的是让用户登录到他们的Windows桌面计算机上的AAD提示符,这样我就可以得到一个承载令牌,它将与我的Azure功能一起工作 我遵循了中的教程,但它只涉及应用程序权限(而不是委派权限) 我已经为Azure广告设置了Azure功能 认证 我已经注册了一个客户端应用程序(在 应用程序注册)。 我已将其配置为使用委派权限 对于Azure函数 这是我的客户代码: var clientId=“我的控制台应用程序的客户端id”//控制台应用程序 var clientUrl=新Uri(“htt

我想做的是让用户登录到他们的Windows桌面计算机上的AAD提示符,这样我就可以得到一个承载令牌,它将与我的Azure功能一起工作

我遵循了中的教程,但它只涉及应用程序权限(而不是委派权限)

  • 我已经为Azure广告设置了Azure功能 认证
  • 我已经注册了一个客户端应用程序(在 应用程序注册)。
    • 我已将其配置为使用委派权限 对于Azure函数
这是我的客户代码:

var clientId=“我的控制台应用程序的客户端id”//控制台应用程序
var clientUrl=新Uri(“https://login.microsoftonline.com/common/oauth2/nativeclient");  
var tenant=“tenantid here”;
字符串权限=”https://login.windows.net/“+承租人;
字符串资源=”https://myaadProtectedFunc.azurewebsites.net";  
AuthenticationContext AuthenticationContext=新的AuthenticationContext(authority,false);
var pp=新的平台参数(PromptBehavior.Auto);
var-token=authenticationContext.AcquireTokenAsync(资源、clientId、clientUrl、,
pp,UserIdentifier.AnyUser)。结果;
WriteLine(“获取令牌:{0}”,token.AccessToken);
我收到一个错误,提示“[我的客户端应用程序]需要权限才能访问您组织中只有管理员才能授予的资源。请要求管理员授予此应用程序的权限,然后才能使用它。”


是否有其他方法可以获得与我的Azure功能一起使用的承载令牌

我做了一个测试,如果你正确设置了azure端,你的代码就可以运行了。很可能在azure功能中,您没有正确设置它

在azure功能中,您是否设置了服务主体? 例如:功能应用程序->平台功能->身份验证/授权->应用程序服务身份验证到打开->选择azure active directory->快速->创建。->按ok键。->保存

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

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


希望这能有所帮助。

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

我可以只使用Azure函数的客户端ID

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

这是为了配置Azure功能-保持所有字段相同,但将a/v2.0添加到颁发者URL:

这是获取Azure函数的委托承载令牌的代码,该函数使用v2.0令牌-我不知道如何将其更改为使用v1令牌:

string[]scopes=新字符串[]{“profile”、“email”、“openid”};
字符串ClientId=[Azure函数的ClientId];
字符串Tenant=[tenantId];
字符串实例=”https://login.microsoftonline.com/";
var\u clientApp=PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority($“{Instance}{Tenant}”)
.WithDefaultRedirectUri()
.Build();
var accounts=_clientApp.GetAccountsAsync().Result;
var authResult=\u clientApp.AcquireTokenInteractive(作用域)
.WithAccount(accounts.FirstOrDefault())
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync().Result;
var bearerTokenForAzureFunction=authResult.IdToken;

现在,如果我可以通过这种方式获得委托的承载令牌,我根本不理解注册客户端应用程序的必要性…

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