第一篇帖子,请温柔!:)
我正在开发一个针对Office 365的MVC .NET 5 Web应用程序,并使用OpenIDConnect框架。 我已经设置了OWIN(3)和ADAL(2)以及我的Azure AD应用程序。 没有用户操作的登录,主控制器附加了[Authorize]属性,强制立即重定向到Azure AD进行登录。 我没有在任何我的Authorize属性中使用角色。
问题:我可以成功登录我的应用程序 - 一次! 在第一次登录之后,我关闭浏览器(或在不同的机器上打开新的浏览器),然后再次进入应用程序。 它将我重定向到Azure AD登录屏幕,我登录并且它不断在应用程序和Azure之间重定向,直到我遇到臭名昭著的400头过长问题。 查看cookie存储,我发现它充满了随机数。 我检查缓存(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=
在发生问题时,我的OpenIdConnectAuthenticationOptions中的AuthorizationCodeReceived通知被触发,因此我知道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属性替换了Authorized属性,并继承了AuthorizeAttribute,只是为了尝试并进入Authorize代码以查看发生了什么。我从MVC 5源代码的版本5构建了一个PDB文件,但所有发生的事情都会跳回到我的代码中:( 话虽如此,我已经覆盖了我能覆盖的部分,并发现filterContext.HttpContext.User.Identity.IsAuthenticated为false,这是有道理的,因为这会导致重定向回Azure登录。
所以我知道:
- Azure接受我的登录并返回相关的令牌
- 在OnAuthorization之前的第二次登录中,filterContext.HttpContext.User.Identity.IsAuthenticated返回false
- 我的Azure应用程序配置正确,否则它就不会进行身份验证
我认为:
- 在MVC Identity设置中存在错误。Azure正常工作,否则它就不能进行身份验证。
- 这不是cookie问题,因为如果您在另一台机器上执行第二次登录,则会出现问题
很抱歉这有点冗长,但是有很多这些无限重定向问题,我需要解释一下我的情况为什么不同!
我想要的(如果不是答案!)是向正确的方向推动我进一步调试的方法。
感谢您能提供的任何帮助!
Andy