PHP Azure OAuth JWT 应用角色

5
我已经从Azure AD中的一个清单中创建了一个应用程序,其中包含多个appRoles,我可以将用户分配到这些角色中。当用户完成单点登录并返回我的应用程序时,我会请求他们的登录信息中的JSON Web Token。问题是,从Azure返回的令牌中没有列出分配的角色,就像这里所示一样。
是否有我遗漏的配置选项或者通过Azure Graph API找到其分配角色的其他方法?
更新:
在请求授权URL时,指定resource作为应用程序ID URI后,我已经取得了一些进展。
现在,我正在收到以下错误消息(在返回URL中):
"The signed in user '<user email>' is not assigned to a role for the application '<app client id>'."

用户在 Azure AD 控制面板中已经被分配了应用程序的角色,并且错误消息中的应用程序客户端 ID 与应用程序的客户端 ID 完全匹配。
应用程序配置:

Azure AD 应用程序配置屏幕

用户被分配了一个角色:

Azure AD 应用程序用户角色分配

登录并返回应用程序后的错误消息:

Azure AD 认证错误消息


这里有一份指南http://www.dushyantgill.com/blog/2014/12/10/roles-based-access-control-in-cloud-applications-using-azure-ad/,它或许能够对您有所帮助。 - Gary Liu
谢谢Gary,但那实际上是我已经在使用的指南,据我所知我已经完全按照它的要求进行了操作。唯一的例外是我的Web应用程序是用PHP编写的。 - Philip
3个回答

1

如果有人在阅读这个帖子寻找解决方案,那么我可能不是他们想要听到的答案。但是我们从OAuth切换到SAML,并且现在成功地在SAML响应中获取应用程序角色。

我只能假设Azure AD上的OAuth实现完全失效了,因为除了切换到SAML外,我们什么都没有改变。


1

@Phlip,请尝试使用PowerShell设置您的应用程序权限,谢谢。

#1.down load Azure AD powershell and login in using your user in AD
$msolcred=get-credential
connect-msolservice -credential $msolcred

#2. get principal Id 
$ClientIdWebApp = '5b597c35-**-**-ad05-***'
$webApp = Get-MsolServicePrincipal –AppPrincipalId $ClientIdWebApp

# 3. use Add-MsolRoleMember to add it to “Company Administrator” role).
Add-MsolRoleMember -RoleName "Company Administrator" -RoleMemberType ServicePrincipal -RoleMemberObjectId $webApp.ObjectId

想要获取更多信息,请参考此页面: https://msdn.microsoft.com/zh-cn/library/azure/dn919663.aspx 并使用以下方法将成员添加到角色中:

Add-MsolRoleMember -RoleName "Company Administrator" -RoleMemberEmailAddress "user@contoso.com"

任何更新或结果,请告诉我。

嗨,威尔,我已经按照这些步骤操作了,但仍然没有进展。有没有一种方法可以使用Azure AD Powershell工具查找用户在应用程序中被分配的角色,以便我可以确认他们确实被分配了?如果某人不是来自Powershell工具,是否有一种方法可以分配给他们? - Philip
@PhilipPryce,我也建议您检查用户是否在目录组中。如果用户尚未添加到目录组中,请将其添加到组中。 - Will Shao - MSFT

0
以下的C#代码可以使用AppRoleAssignedTo属性查询你的应用程序所分配的用户。我不熟悉php,但我相信它有类似的方法。ActiveDirectoryClient类来自Active Directory Graph Client Library
var Serprincipal = activeDirectoryClient.ServicePrincipals.Where(IServicePrincipal => IServicePrincipal.AppId.Equals("app client id")).ExecuteAsync().Result.CurrentPage.ToList();
            var sp = Serprincipal.FirstOrDefault();
            var userAssignments = (sp as IServicePrincipalFetcher).AppRoleAssignedTo.ExecuteAsync().Result.CurrentPage.ToList();
           foreach (IAppRoleAssignment assignedUser in userAssignments)
            {
               Console.WriteLine("UserId: {0}  Name: {1} ObjectType: {2} ", assignedUser.PrincipalId, assignedUser.PrincipalDisplayName, assignedUser.ObjectType);
           }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接