Microsoft图形API身份验证

时间:2018-09-09 08:54:02

标签: c# asp.net-mvc microsoft-graph

我实际上是在探索Microsoft图形API,并寻找一种无需任何交互即可身份验证为用户的解决方案,但找不到解决方案。我发现的每个代码示例都需要用户交互才能在Microsoft上签名以获取令牌。有可能避免用户交互吗?

否则,在此示例中,我发现了一种使用客户端凭证流的解决方法:https://github.com/microsoftgraph/console-csharp-snippets-sample 但是,如果我尝试在c#Asp.net mav应用程序或Windows窗体应用程序中实现此代码,则无法获得应用程序令牌。如果我调试该应用程序,它将停留在等待令牌的过程中,但不会引发错误(病毒防护已被禁用)。有没有人知道主要问题或我的解决方法?

这是我尝试获取令牌的解决方法的代码,但卡在daemonClient.AcquireTokenForClientAsync上。

   public async Task<Users> GetUser(string Username)
    {
        MSALCache appTokenCache = new MSALCache(clientId);

        ClientCredential clientdummy = new ClientCredential(clientSecret);

        ConfidentialClientApplication daemonClient = new ConfidentialClientApplication(clientId, string.Format(AuthorityFormat, tenantId), redirectUri,
                                                            clientdummy, null, null);

        authenticate(daemonClient).Wait();

        string token = authResult.AccessToken;

        client = GetAuthenticatedClientForApp(token);

        IGraphServiceUsersCollectionPage users = client.Users.Request().GetAsync().Result;
    }

    private async Task<AuthenticationResult> authenticate(ConfidentialClientApplication daemonClient)
    {
        authResult = await daemonClient.AcquireTokenForClientAsync(new[] { MSGraphScope });
        return authResult;
    }

2 个答案:

答案 0 :(得分:1)

找到了解决方法:通过REST API获取令牌。在这里,我可以获取用户令牌或客户端令牌来访问图形API:

sort_by!

答案 1 :(得分:0)

根据您的描述,我假设您需要一种无需任何交互即可对用户进行身份验证的解决方案。

我们可以通过某些后台服务或守护程序获取访问令牌。

有关更多详细信息,请参阅this document

根据我的测试,我们可以尝试以下步骤:

首先,我们应该征得管理员的同意:

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 = await daemonClient.AcquireTokenForClientAsync(new[] { MSGraphScope });

然后,我们可以使用此访问令牌来使用Graph API。

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