我试图通过Graph API获取当前用户的数据。我想获取访问令牌并将其附加到请求消息中。所以我想跳过登录界面。有些原因我得到了(401)Unauthorized错误,用户无效...我注册了我的app(mvc)AAD,以及那里的秘密,客户ID,租户ID。
这是获取令牌的方法:
public static string GetToken()
{
string authority = "https://graph.microsoft.com/{tenantID}/oauth2/token";
string clientId = "client id";
string secret = "client secret";
string resource = "https://graph.microsoft.com";
AuthenticationContext authContext = new AuthenticationContext(authority);
ClientCredential clientCredential = new ClientCredential(clientId, secret);
AuthenticationResult authResult = authContext.AcquireToken(resource, clientCredential);
return authResult.AccessToken;
}
这是代码,我附加了访问令牌:
public static GraphServiceClient GetAuthenticatedClient()
{
GraphServiceClient graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
string accessToken = GetToken();
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
}));
return graphClient;
}
任何建议都会有所帮助,因为我不知道。
答案 0 :(得分:1)
Azure AD发布了两种访问令牌。
第一个是委托令牌,用于委派用户操作用户的资源。
另一个是应用程序令牌,它通常用于对所有组织的资源执行操作,并且此令牌中没有用户上下文(当前用户)。因此,我们不应该使用此令牌来执行需要用户上下文的 public boolean pan(float x, float y, float deltaX, float deltaY) {
lastTouch = new Vector2(x, y).sub(deltaX, deltaY);
Vector2 newTouch = new Vector2(x, y);
Vector2 delta = newTouch.cpy().sub(lastTouch);
if(lastTouch.x > Gdx.graphics.getWidth()/2 && newTouch.x > Gdx.graphics.getWidth()/2){
if(shoot) {
bullets.add(new Bullet(WorldUtils.createBullet(stage.getWorld(), stage.getPlayer().getBody().getPosition().x+70, stage.getPlayer().getBody().getPosition().y, new Vector2(delta.x, -delta.y)), new Vector2(delta.x, -delta.y)));
shoot = false;
}
stage.getPlayer().turn(new Vector2(delta.x, -delta.y));
}
lastTouch = newTouch;
return true;
}
资源。
要使用应用程序令牌来操作资源,我们需要使用用户集合指定用户,如下面的代码:
me
答案 1 :(得分:1)
这解决了吗?如果没有,我不认为你正在使用正确的权威。如果您的资源是" https://graph.microsoft.com/"那么你的权威应该是" https://login.windows.net/common/oauth2/v2.0/token"或相同的权力,但交换"共同"为您的天蓝色AD租户ID。来自here
的信息