我将一个MVC Web应用程序(WebAPI + Angular)部署到Azure作为Web应用程序(而不是API应用程序),设置为使用设置保护 - >认证/授权 - > AAD - >表达。这创建了一个与Web App同名的AD应用程序,并且作为普通的Web用户(在目录中,使用OAuth),这可以按预期工作。
但我也有外部自动化需要直接调用WebAPI控制器,因此我需要以编程方式获取Bearer令牌以传递这些请求。
当“需要访问APP的用户分配”==否时,这一切都正常。但这还不够,因为目录中的每个人都不应该访问此应用程序。
翻转该开关会导致错误:
应用程序“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);
如何为应用添加角色分配?
(与用户相对)
我尝试使用“其他应用程序的权限”部分,但无法将应用添加到自身。为了看看这是否可以解决另一个应用程序的问题,我继续创建了一个并且能够添加App&将委派权限设置为“访问[应用程序名称]”。但与以前一样,这仅适用于访问应用程序不需要用户分配的情况。之后AcquireToken()
抛出相同的异常。
似乎这个问题could be solved通过将我们的API与Angular应用程序分离,将API作为API应用程序(带有网关)托管,但目前这不是一个选项。另外this article表示这个新的Auth功能“替换了大多数应用程序的App Service网关”和this blog post在11月宣布该功能说“我们推荐网络和移动应用程序使用此功能而不是App Service网关前进“所以我想知道这是否还没有进入UI&也许可以通过app清单(尝试过,失败过),graph / service-mgmt api,powershell等添加应用程序角色分配。
答案 0 :(得分:6)
关键是在清单中定义正确的appRoles(使用正确的allowedMemberType)。
在Azure门户中,配置以下内容:
在需要访问的资源中,打开清单('应用注册'刀片)。在 appRoles 数组中,添加两个角色:
保存清单。
接下来,在需要访问资源的客户端应用中:
配置用户权限:
在“属性”部分中,保留“需要用户分配?”复选框已启用这将仅限制对已配置用户的访问。
现在您可以作为用户和应用程序访问资源。
答案 1 :(得分:0)