我正在将WinForms应用程序作为Azure Native Client进行身份验证,并且可以访问Azure托管服务API。我已在本机客户端和服务API上定义了应用程序角色,并将本机客户端的权限分配给服务API。这很好,我确实将应用程序角色分配给我在服务API中定义的用户。例如,我为HTTP GET和HTTP POST操作定义了READ和WRITE角色并保护了API。但是,我没有获得我在Native Client中定义的角色。我已经定义了本地客户端角色,例如“USER”和“ADMIN”。这些角色将用于隐藏/显示UI的部分。当本机客户端进行身份验证时,它指定本机客户端ID和服务API的资源ID。我理解我获得的令牌专门用于服务,这可能就是为什么我只接收该服务的角色而不是我的客户角色。那么,如何在不使用图形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;
}
答案 0 :(得分:0)
此身份验证只需要访问资源的权限,因此资源ID是资源的App ID网址。所以我认为你的代码不会得到本机应用程序的作用。如果你想这样做,我认为你需要图形API。