无法基于访问令牌对用户进行身份验证 - MS Graph API C#

时间:2017-06-28 08:26:45

标签: azure-active-directory access-token microsoft-graph azure-ad-graph-api

我试图通过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;
    }

任何建议都会有所帮助,因为我不知道。

2 个答案:

答案 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

的信息