первый пост, будьте нежны!:)
Я разрабатываю веб-приложение MVC.NET 5 для Office 365 и использую структуру OpenIDConnect. Я установил OWIN (3) и ADAL (2) и мое приложение Azure AD. Нет логина для входа пользователя, у домашнего контроллера есть атрибут [Авторизовать], заставляющий немедленный переадресацию входа в Azure AD. Я не использую роли в любом из моих атрибутов Authorize.
Проблема. Я могу войти в мои приложения успешно - ОДИН! После первого входа я закрываю браузер (или открываю новый браузер на другой машине), и я снова ударяю приложение. Он перенаправляет меня на экран входа в Azure AD, в который я вхожу, и затем он постоянно перенаправляет между приложением и Azure, пока я не получу печально известный 400 заголовков. Заглядывая в магазин печенья, я нахожу его полным нонче. Я проверяю кеш (рецепт Vittorio EFADALCache, хотя я использовал TokenCache.DefaultShared, когда эта проблема была обнаружена) и содержит сотни строк данных кэша (только одна строка, сгенерированная с успешным знаком).
Я вижу, что через выходное окно происходят перенаправления, когда каждый обратный маршрут генерирует новый токен доступа и обновления:
Microsoft.IdentityModel.Clients.ActiveDirectory Verbose: 1 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - AcquireTokenByAuthorizationCodeHandler: Resource value in the token response was used for storing tokens in the cache
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - AcquireTokenByAuthorizationCodeHandler: Resource value in the token response was used for storing tokens in the cache
Microsoft.IdentityModel.Clients.ActiveDirectory Information: 2 : 31/07/2015 12:31:52: - TokenCache: Deserialized 1 items to token cache.
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: - TokenCache: Deserialized 1 items to token cache.
Microsoft.IdentityModel.Clients.ActiveDirectory Verbose: 1 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: Storing token in the cache...
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: Storing token in the cache...
Microsoft.IdentityModel.Clients.ActiveDirectory Verbose: 1 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: An item was stored in the cache
iisexpress.exe Information: 0 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - TokenCache: An item was stored in the cache
Microsoft.IdentityModel.Clients.ActiveDirectory Information: 2 : 31/07/2015 12:31:52: 15ad306e-e26d-4827-98dc-dea75853788a - AcquireTokenHandlerBase: === Token Acquisition finished successfully. An access token was retuned:
Access Token Hash: PN5HoBHPlhhHIf1lxZhEWb4B4Hli69UKgcle0w7ssvo=
Refresh Token Hash: 3xmypXCO6MIMS9qUV+37uPD4kPip9WDH6Ex29GdWL88=
Expiration Time: 31/07/2015 13:31:51 +00:00
User Hash: GAWUtY8c4EKcJnsHrO6NOzwcQDMW64z5BNOvVIl1vAI=
Уведомление AuthorizationCodeReceived в моем OpenIdConnectAuthenticationOptions ударяется, когда проблема возникает, поэтому я знаю, что Azure считает, что логин был успешным (или перенаправление обратно к приложению не произойдет):
private static void PrepO365Auth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
//Configure OpenIDConnect, register callbacks for OpenIDConnect Notifications
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigHelper.ClientId,
Authority = authority,
PostLogoutRedirectUri = "https://localhost:44300/Account/SignedOut",
RedirectUri = "https://localhost:44300/",
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = (context) =>
{
ClientCredential credential = new ClientCredential(ConfigHelper.ClientId, ConfigHelper.AppKey);
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(authority, new EFADALTokenCache(signedInUserID)); // TokenCache.DefaultShared Probably need a persistent token cache to handle app restarts etc
AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
context.Code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, ConfigHelper.GraphResourceId);
return Task.FromResult(0);
},
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error/ShowError?signIn=true&errorMessage=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
}
}
Я заменил (после обнаружения проблемы) Авторизованный атрибут с моим собственным атрибутом Auth, наследующим от AuthorizeAttribute, чтобы я мог попытаться войти в код авторизации и посмотреть, что происходит. Я построил PDB файл из версии исходного кода версии MVC 5 версии 5, но все, что происходит, это то, что оно возвращается в мой собственный код:( Как говорится, я переопределил все, что мог, и нашел, что filterContext.HttpContext.User.Identity.IsAuthenticated является ложным, что имеет смысл, так как это приведет к перенаправлению обратно к значку Azure.
Итак, я знаю, что:
- Azure принимает мой логин и возвращает соответствующие токены
- При втором входе в систему, перед OnAuthorization, filterContext.HttpContext.User.Identity.IsAuthenticated возвращает false
- Конфигурация приложения Azure хорошо, или вообще не будет аутентифицироваться
Я думаю, что:
- В настройке MVC Identity есть что-то неправильное. Azure работает правильно или вообще не аутентифицируется.
- Это не проблема с cookie, так как проблема возникает, если вы выполняете второй вход на другой машине.
Мне жаль, что это немного длиннее, но есть так много из этих бесконечных проблем с перенаправлением, мне нужно было объяснить, почему моя ситуация была иной!
То, что я ищу (если не ответ!), - это толкание в правильном направлении относительно того, как я могу отлаживать дальше.
Цените любую помощь, которую вы можете дать!
Andy