.net 如何获取Azure本机客户端应用程序角色?

.net 如何获取Azure本机客户端应用程序角色?,.net,azure,authentication,adal,role,.net,Azure,Authentication,Adal,Role,我正在将WinForms应用程序验证为具有Azure托管服务API访问权限的Azure本机客户端。我已经在本机客户端和服务API上定义了应用程序角色,并将本机客户端的权限分配给服务API。这一切都很好,我确实在服务API中为我的用户定义了应用程序角色。例如,我为HTTPGET和HTTPPOST操作定义了读写角色,并保护了API。但是,我没有得到我在本机客户端中定义的角色。我已经定义了本机客户端角色,如“用户”和“管理员”。这些角色将用于隐藏/显示UI的部分。当本机客户端进行身份验证时,它将指定服

我正在将WinForms应用程序验证为具有Azure托管服务API访问权限的Azure本机客户端。我已经在本机客户端和服务API上定义了应用程序角色,并将本机客户端的权限分配给服务API。这一切都很好,我确实在服务API中为我的用户定义了应用程序角色。例如,我为HTTPGET和HTTPPOST操作定义了读写角色,并保护了API。但是,我没有得到我在本机客户端中定义的角色。我已经定义了本机客户端角色,如“用户”和“管理员”。这些角色将用于隐藏/显示UI的部分。当本机客户端进行身份验证时,它将指定服务API的本机客户端ID和资源ID。我知道我得到的令牌是专门用于服务的,这可能就是为什么我只接收该服务的角色,而不接收我的客户端角色。那么,如何在不使用graph API的情况下获得本机客户端角色呢?用于身份验证的方法需要资源ID。本机客户端未定义资源ID(应用程序ID URI)。正如我在令牌请求中指定的那样,我希望同时接收客户端和资源应用程序角色

 UserCredential uc = new UserCredential();
            try
            {
                // This method requires a resourceId. 
                // How do I request a token for just the client that returns client app roles, or client and servcie roles in one request?
                // Azure Native Client does not define a resourceId, a.k.a. APP ID URI
                result = authContext.AcquireTokenAsync(odataServiceResourceId, clientId, uc).Result; 

                var jwt = new JwtSecurityTokenHandler().ReadJwtToken(result.AccessToken);
                String[] roles = jwt.Claims.Where(c => c.Type == "roles").Select(c => c.Value).ToArray(); // missing client roles???
                txtResults.Text = "Application roles assigned to you: ";
                foreach(var role in roles)
                {
                    txtResults.Text += role + ",";
                }
                // roles is missing the client roles, but has the service roles???
                btnSignIn.Text = "Sign Out";
                lblUser.Text = String.Format(@"{0} {1}", result.UserInfo.GivenName, result.UserInfo.FamilyName);
                lblMessage.Text = "Sign in successfull";
            }
            catch (Exception ee)
            {
                lblMessage.Text = ee.Message;
                return;
            }

此身份验证只需要访问资源的权限,因此资源ID是资源的应用程序ID url。所以我认为您的代码将无法获得本机应用程序的角色。如果您想这样做,我认为您需要graph API。

此身份验证只需要访问资源的权限,因此资源ID是资源的应用程序ID url。所以我认为您的代码将无法获得本机应用程序的角色。如果您想这样做,我想您需要graph API。

这也是我得出的结论。我必须授予graph API权限,然后进行调用以获取客户端的应用程序角色。这也是我得出的结论。我必须授予graph API权限,然后调用以获取客户端的应用程序角色。