Azure Active Directory - 从VS2013中的模板项目调用Microsoft Graph API

时间:2016-08-03 05:20:52

标签: azure openid ws-federation azure-ad-graph-api

以下是我面临的问题:

  • 我从VS2013创建了一个项目,MVC和多租户组织 帐户登录,使用AAD进行身份验证
  • 项目模板对我来说很好,但我需要更多,我需要 调用图API
  • 调用图API的github上的sample项目也可以自行运行,但我们需要将相同的概念应用到我们的项目中 这是基于VS2013的模板
  • 尝试使用类似方法从我们的解决方案调用图形API时 方式,它不起作用

以下是过去几天我一直在经历的痛苦总结。

VS2013项目模板将此代码用于帐户控制器中的SignIn方法:

 WsFederationConfiguration config = FederatedAuthentication.FederationConfiguration.WsFederationConfiguration;
        string callbackUrl = Url.Action("Index", "Home", routeValues: null, protocol: Request.Url.Scheme);
        SignInRequestMessage signInRequest = FederatedAuthentication.WSFederationAuthenticationModule.CreateSignInRequest(
            uniqueId: String.Empty,
            returnUrl: callbackUrl,
            rememberMeSet: false);
        signInRequest.SetParameter("wtrealm", IdentityConfig.Realm ?? config.Realm);
        return new RedirectResult(signInRequest.RequestUrl.ToString());

github的示例项目使用:

HttpContext.GetOwinContext()
                .Authentication.Challenge(new AuthenticationProperties {RedirectUri = "/"},
                    OpenIdConnectAuthenticationDefaults.AuthenticationType);

然后在启动类上它捕获AuthorizationCodeReceived,如下所示:

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {

                ClientId = clientId,
                Authority = Authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    //
                    // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
                    //

                    AuthorizationCodeReceived = (context) =>
                    {
                        var code = context.Code;

然后将它保存在TokenCache中,当调用图形API时,它会像这样用缓存启动AuthenticationContext类

                AuthenticationContext authContext = new AuthenticationContext(Startup.Authority,
                new NaiveSessionCache(userObjectID));
            ClientCredential credential = new ClientCredential(clientId, appKey);
            result = authContext.AcquireTokenSilent(graphResourceId, credential,
                new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

我试图做的是:

 AuthenticationContext authContext = new AuthenticationContext(authority);
                ClientCredential credential = new ClientCredential(clientId, appKey);

result = await authContext.AcquireTokenAsync(graphResourceId,credential);

这将返回一个包含一些缺少信息的较短标记。

如果您使用MVC和组织帐户登录在VS2013中创建新项目,则可以轻松复制此问题,然后尝试调用图API。

我需要一种使用VS2013中的模板项目调用图API的方法。

1 个答案:

答案 0 :(得分:0)

我们就此问题与Microsoft支持部门联系,以下是该解决方案的摘要。从VS2013创建的模板使用WSFederation库进行身份验证。没有简单的方法可以使用它来调用Graph API。 Microsoft在VS2015中对此进行了纠正,其中相同的模板使用OpenID库进行身份验证,然后您可以调用Graph API。