Вот краткое описание проблемы, с которой я столкнулся:
- Я создал проект из VS2013, MVC с входом в учетную запись многопользовательской организации, использует AAD для аутентификации.
- Шаблон проекта мне подходит, но мне нужно больше, мне нужно вызвать API графа
- Проект образец на github, который вызывает API-интерфейс графа, также отлично работает. сам по себе, но нам нужно применить ту же концепцию в нашем проекте, который основан на шаблоне из 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);
результат = ожидание authContext.AcquireTokenAsync (graphResourceId, учетные данные);
Это возвращает более короткий токен с некоторой недостающей информацией.
Эту проблему можно легко воспроизвести, если вы создадите новый проект в VS2013 с использованием MVC и входа в учетную запись организации, а затем попытаетесь вызвать API-интерфейс графа.
Мне нужен способ вызова API-интерфейса графа с использованием проекта шаблона из VS2013.