我有一个MVC Web应用程序(WebAPI + Angular)部署到Azure作为Web应用程序(而不是API应用程序),设置为使用设置 - >身份验证/授权 - > AAD - > Express进行保护.这创建了一个与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);
如何为应用程序添加角色分配?
(而不是用户)
我尝试使用"其他应用程序的权限"部分,但无法将应用程序添加到自身.为了查看这是否可以解决另一个应用程序的问题,我继续创建了一个,并且能够添加应用程序并将委托权限设置为"访问[应用程序名称]".但与以前一样,这仅适用于访问应用程序不需要用户分配的情况.然后AcquireToken()
抛出相同的异常.
看起来这个问题可以通过将我们的API与Angular应用程序分离来解决,将API作为API应用程序(带有网关)托管,但目前这不是一个选项.此外,本文还说这个新的Auth功能" 替换了大多数应用程序的App Service网关 ",这篇博文在11月宣布该功能说" 我们建议网络和移动应用程序使用此功能而不是App Service网关 ",所以我想知道如果这还没有进入UI并且可能通过应用程序清单(尝试,失败),graph/service-mgmt api,powershell等添加应用程序角色分配.
关键是在清单中定义正确的appRoles(使用正确的allowedMemberType).
在Azure门户中,配置以下内容:
在需要访问的资源中,打开清单("App Registrations"刀片).在appRoles数组中,添加两个角色:
allowedMemberType'Application'之一
allowedMemberType'User'之一
保存清单.
接下来,在需要访问资源的客户端应用程序中:
浏览到" 必需权限 "并点击"添加"
搜索您要访问的资源
在"启用访问"部分的"应用程序权限"下,选择刚刚配置的角色
保存并点击"授予权限"
要配置用户权限:
浏览到"企业应用程序"刀片
选择"所有应用程序",然后选择正确的应用程序
点击"用户和群组"
将用户分配给角色
在"属性"部分中,保留"需要用户分配?" 复选框已启用 这将仅限制对已配置用户的访问.
现在,您可以作为用户和应用程序访问资源.