因此,我构建并发布了一个使用 Azure B2C 作为身份验证机制的新网站。
我发现登录和签名在一段时间内可以正常工作。但是一段时间后,比如在访问部署后的站点几个小时后,我会发现在登录或注册时,成功验证后,我的浏览器不会被重定向回 b2c 配置中设置的返回 url在受授权属性保护的身份验证后登录页面与 Azure B2C 登录页面之间陷入无限循环,最后以 Http 400 错误消息结束,并显示消息 - 错误请求 - 请求太长。
我对此进行了一些谷歌搜索,有很多帖子表明问题出在 cookie 上,删除 cookie 应该可以解决问题。不是这种情况。我发现解决此问题的唯一方法是在网络服务器上重新启动应用程序,或者等待 24 小时以重置某种缓存或应用程序池。有人知道这里发生了什么吗?
最佳答案
好吧,我想我可能已经找到答案了。
看起来 Microsoft.Owin 库及其设置 cookie 的方式存在问题。根据 this article 直接写入 System.Web 可以解决此问题.
建议的解决方案有以下三种:
确保在身份验证之前建立 session :System.Web 和 Katana cookie 之间的冲突是针对每个请求的,因此应用程序可能会在身份验证流程之前根据某些请求建立 session 。当用户第一次到达时,这应该很容易做到,但稍后可能很难保证 session 或身份验证 cookie 过期和/或需要刷新。
禁用SessionStateModule:如果应用程序不依赖 session 信息,但 session 模块仍在设置导致上述冲突的cookie,那么您可以考虑禁用 session 状态模块。
里>重新配置 CookieAuthenticationMiddleware 以直接写入 System.Web 的 cookie 集合。
我将选择第三个选项,即覆盖默认的 Cookie AuthenticationMiddleware,正如他们在下面建议的那样。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
// ...
CookieManager = new SystemWebCookieManager()
});
public class SystemWebCookieManager : ICookieManager
{
public string GetRequestCookie(IOwinContext context, string key)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
var cookie = webContext.Request.Cookies[key];
return cookie == null ? null : cookie.Value;
}
public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (options == null)
{
throw new ArgumentNullException("options");
}
var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
bool pathHasValue = !string.IsNullOrEmpty(options.Path);
bool expiresHasValue = options.Expires.HasValue;
var cookie = new HttpCookie(key, value);
if (domainHasValue)
{
cookie.Domain = options.Domain;
}
if (pathHasValue)
{
cookie.Path = options.Path;
}
if (expiresHasValue)
{
cookie.Expires = options.Expires.Value;
}
if (options.Secure)
{
cookie.Secure = true;
}
if (options.HttpOnly)
{
cookie.HttpOnly = true;
}
webContext.Response.AppendCookie(cookie);
}
public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (options == null)
{
throw new ArgumentNullException("options");
}
AppendResponseCookie(
context,
key,
string.Empty,
new CookieOptions
{
Path = options.Path,
Domain = options.Domain,
Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
}
}
我会尝试一下,然后将我的结果发布回此处。
关于azure - 将 Azure B2C 与 MVC 应用程序一起使用会进入无限循环,导致错误请求 - 请求太长 Http 400 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47598741/