如何在Microsoft Graph API C#中获取用户ID和访问令牌

时间:2018-08-10 14:18:30

标签: c# oauth microsoft-graph

我正在尝试创建一个多租户应用程序,该应用程序将允许用户访问其OneDrive。由于要运行该应用程序的设备的类型,让用户每次访问该应用程序时都输入用户名和密码是不切实际的,因此我将设置该应用程序,以便管理员可以代表用户授予权限的用户仅使用该应用程序的权限(我已完成管理员同意)。

我现在遇到的麻烦是,当用户访问该应用程序时,我只有他们的电子邮件地址。

我如何才能根据用户的电子邮件地址获取访问令牌,而无需他们登录(他们的管理员已经同意,因此用户也不必登录)?

2 个答案:

答案 0 :(得分:0)

如果管理员已经同意,则可以使用可能性login without the user并检索令牌。

我如何获得OneDrive?

  1. 您声明拥有用户的电子邮件,因此可以执行查询https://graph.microsoft.com/v1.0/users/{email address},并获取id字段的值。
  2. 执行查询https://graph.microsoft.com/v1.0/users/{user id}/drive,您就拥有了用户的驱动力。

答案 1 :(得分:0)

安迪

根据this reference,我们可以通过某些后台服务或守护程序获取AccessToken。

根据我的测试,我们可以尝试以下步骤:
1.获得管理员同意:

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
         ClientId = clientId,
         Authority = authority,
         RedirectUri = redirectUri,
         PostLogoutRedirectUri = redirectUri,
         Scope = "openid profile",
         ResponseType = "id_token",
         TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, NameClaimType = "name" },
         Notifications = new OpenIdConnectAuthenticationNotifications
                             {
                                    AuthenticationFailed = this.OnAuthenticationFailedAsync,
                                    SecurityTokenValidated = this.OnSecurityTokenValidatedAsync
                              }
   });

ConfidentialClientApplication daemonClient = new ConfidentialClientApplication(Startup.clientId, string.Format(AuthorityFormat, tenantId), Startup.redirectUri,
                                                                                       new ClientCredential(Startup.clientSecret), null, appTokenCache.GetMsalCacheInstance());

AuthenticationResult authResult =等待daemonClient.AcquireTokenForClientAsync(new [] {MSGraphScope});

  1. 我们可以通过来自以下网址的电子邮件获取用户:https://graph.microsoft.com/v1.0/users/{userPrincipalName}。例如,https://graph.microsoft.com/v1.0/users/xxx.outlook.com

有关更多详细信息,我们可以在GitHub上参考v2.0 daemon sample