azure - 将 Azure B2C 与 MVC 应用程序一起使用会进入无限循环,导致错误请求 - 请求太长 Http 400 错误

标签 azure azure-ad-b2c

因此,我构建并发布了一个使用 Azure B2C 作为身份验证机制的新网站。

我发现登录和签名在一段时间内可以正常工作。但是一段时间后,比如在访问部署后的站点几个小时后,我会发现在登录或注册时,成功验证后,我的浏览器不会被重定向回 b2c 配置中设置的返回 url在受授权属性保护的身份验证后登录页面与 Azure B2C 登录页面之间陷入无限循环,最后以 Http 400 错误消息结束,并显示消息 - 错误请求 - 请求太长。

我对此进行了一些谷歌搜索,有很多帖子表明问题出在 cookie 上,删除 cookie 应该可以解决问题。不是这种情况。我发现解决此问题的唯一方法是在网络服务器上重新启动应用程序,或者等待 24 小时以重置某种缓存或应用程序池。有人知道这里发生了什么吗?

最佳答案

好吧,我想我可能已经找到答案了。

看起来 Microsoft.Owin 库及其设置 cookie 的方式存在问题。根据 this article 直接写入 System.Web 可以解决此问题.

建议的解决方案有以下三种:

  1. 确保在身份验证之前建立 session :System.Web 和 Katana cookie 之间的冲突是针对每个请求的,因此应用程序可能会在身份验证流程之前根据某些请求建立 session 。当用户第一次到达时,这应该很容易做到,但稍后可能很难保证 session 或身份验证 cookie 过期和/或需要刷新。

  2. 禁用SessionStateModule:如果应用程序不依赖 session 信息,但 session 模块仍在设置导致上述冲突的cookie,那么您可以考虑禁用 session 状态模块。

  3. 重新配置 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/

相关文章:

angular - 部署Azure Web App(Angular)不起作用

asp.net-mvc - 使用 Asp.net 4.6 的 Azure SignalR 服务

azure - V2 Azure Function ServiceBusTrigger 不工作

azure - 具有持久功能的巨大 2 类队列操作计数

azure - 自定义 Azure B2C 登录 UI

azure - 使用 Active Directory 图形客户端删除 AAD B2C 中的用户

azure - 在 PhoneFactor-InputOrVerify 技术配置文件(B2C 自定义用户流程)中,是否可以允许用户更改其默认手机号码?

Azure Service Fabric 应用程序

Azure AD B2C : AcquireTokenSilentAsync returns empty access token

asp.net-mvc - 从 Azure AD 模拟到 Azure B2C