我有一个MVC Web应用程序(WebAPI + Angular),部署到Azure作为Web应用程序(而不是API应用程序),并设置使用“设置”->“身份验证/授权”->“AAD”->“快速”进行安全保护。这将创建与Web应用程序名称相同的AD应用程序,并且作为普通Web用户(在目录中,使用OAuth)时,可以按预期工作。
但是,我还有需要直接调用WebAPI控制器的外部自动化,因此我需要以编程方式获取Bearer令牌,以便将其与这些请求一起传递。
当"USER ASSIGNMENT REQUIRED TO ACCESS APP" == NO时,所有这些都正常工作。但这不足够,因为目录中的每个人都不应该都能访问此应用程序。
更改该开关会导致以下错误:
“应用程序'AppId'未分配给应用程序'AppId'的角色。”
正在使用的代码:
但是,我还有需要直接调用WebAPI控制器的外部自动化,因此我需要以编程方式获取Bearer令牌,以便将其与这些请求一起传递。
当"USER ASSIGNMENT REQUIRED TO ACCESS APP" == NO时,所有这些都正常工作。但这不足够,因为目录中的每个人都不应该都能访问此应用程序。
更改该开关会导致以下错误:
“应用程序'AppId'未分配给应用程序'AppId'的角色。”
正在使用的代码:
var aadLoginUri = "http://login.microsoftonline.com/{0}";
var tenantId = "[xxx].onmicrosoft.com";
var authority = String.Format(CultureInfo.InvariantCulture, aadLoginUri, tenantId);
var clientId = ConfigurationManager.AppSettings["ClientId"];
var clientSecret = ConfigurationManager.AppSettings["ClientSecret"];
var authContext = new AuthenticationContext(authority);
ClientCredential clientCredential = new ClientCredential(clientId, clientSecret);
AuthenticationResult authResult = authContext.AcquireToken(clientId, clientCredential);
如何为应用程序添加角色分配?
(与用户分配不同)
我尝试使用“向其他应用程序授予权限”部分,但无法将应用程序添加到自身。为了查看是否可以从另一个应用程序解决此问题,我继续创建了一个应用程序,并能够添加应用程序并将委派权限设置为“访问[应用程序名称]”。但是就像以前一样,只有在不需要用户分配即可访问应用程序时才有效。之后,AcquireToken()
抛出相同的异常。
似乎这个问题可以通过将我们的API与Angular应用程序解耦来解决,将API作为API应用程序(带有网关)托管,但目前这不是一个选项。此外,这篇文章说这个新的身份验证功能“替代了大多数应用程序的应用服务网关”,而这篇11月份发布的博客文章说“我们建议Web和移动应用程序使用这个功能,而不是继续使用应用服务网关”,所以我想知道这是否只是还没有进入UI界面,或者可能可以通过应用程序清单(尝试过,失败了),图形/服务管理API、PowerShell等添加应用程序角色分配。