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

How to get Azure Native Client Application Roles?

我正在将 WinForms 应用程序验证为 Azure 本机客户端,可以访问 Azure 托管服务 API。我已经在本机客户端和服务 API 上定义了应用程序角色,并将本机客户端的权限分配给服务 API。这一切都很好,我确实获得了分配给我在服务 API 中定义的用户的应用程序角色。例如,我已经为 HTTP GET 和 HTTP POST 操作定义了 READ 和 WRITE 角色,并保护了 API。但是,我没有获得我在 Native Client 中定义的角色。我已经定义了本地客户端角色,例如 'USER' 和 'ADMIN'。这些角色将用于 UI 的 hide/show 部分。当本机客户端进行身份验证时,它会指定本机客户端 ID 和服务的资源 ID API。我知道我得到的令牌是专门用于该服务的,这可能就是为什么我只收到该服务的角色而不是我的客户角色的原因。那么,如何在不使用图表 API 的情况下获得我的本地客户端角色?验证方法需要一个 resourceID。本机客户端未定义 resourceID(APP 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就是资源的App IDurl。所以我认为您的代码不会获得本机应用程序的角色。如果你想这样做,我认为你需要图表 API.