Azure Active Directory - 从 VS2013 中的模板项目调用 Microsoft Graph API
Azure Active Directory - Calling Microsoft Graph API from the template project in VS2013
下面是对我面临的问题的分解:
- 我从 VS2013 创建了一个项目,具有多租户组织的 MVC
账号登录,使用AAD认证
- 项目模板对我来说很好,但我需要更多,我需要
调用图表 API
- github 上调用图形 API 的 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);
然后在启动时 class 它会像这样捕获 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 class
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);
这个 returns 一个较短的令牌,缺少一些信息。
如果您使用 MVC 和组织帐户登录在 VS2013 中创建一个新项目,然后尝试调用图形 API,则可以轻松复制此问题。
我需要一种使用 VS2013 中的模板项目调用图表 API 的方法。
我们就此问题联系了 Microsoft 支持人员,这里是解决方案的摘要。从 VS2013 创建的模板使用 WSFederation 库进行身份验证。没有简单的方法可以使用它来调用图形 API。 Microsoft 在 VS2015 中对此进行了纠正,其中相同的模板使用 OpenID 库进行身份验证,然后您可以调用 Graph API.
下面是对我面临的问题的分解:
- 我从 VS2013 创建了一个项目,具有多租户组织的 MVC 账号登录,使用AAD认证
- 项目模板对我来说很好,但我需要更多,我需要 调用图表 API
- github 上调用图形 API 的 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);
然后在启动时 class 它会像这样捕获 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 class 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);
这个 returns 一个较短的令牌,缺少一些信息。
如果您使用 MVC 和组织帐户登录在 VS2013 中创建一个新项目,然后尝试调用图形 API,则可以轻松复制此问题。
我需要一种使用 VS2013 中的模板项目调用图表 API 的方法。
我们就此问题联系了 Microsoft 支持人员,这里是解决方案的摘要。从 VS2013 创建的模板使用 WSFederation 库进行身份验证。没有简单的方法可以使用它来调用图形 API。 Microsoft 在 VS2015 中对此进行了纠正,其中相同的模板使用 OpenID 库进行身份验证,然后您可以调用 Graph API.