首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只在MVC Azure生产站点上登录失败

只在MVC Azure生产站点上登录失败
EN

Stack Overflow用户
提问于 2019-03-01 22:17:23
回答 1查看 103关注 0票数 0

简短的版本:

我有一个MVC5网站应用程序部署为一个Azure云服务web角色。使用Owin作为登录流。在本地主机上测试站点时,Owin集成可以正常工作,但是在生产服务器上,GetExternalLoginInfoAsync()正在从signin的回调中返回null。

一些细节:

  • 拥有所有最新的Owin包(4.0.1除了Identity.Owin 2.2.2和Owin (启动组件) 1.0)。
  • 该应用程序使用基本的Owin身份验证(传统登录很好)。
  • 我们不使用默认的Owin SigninManager,或者按照MVC WebApplication模板使用UserManager。(理论上说,在达到任何代码之前就会发生故障!)
  • 在Windows 10上使用Chrome进行测试。
  • 它在本地主机(调试和发布)上运行得很好,直接从visual studio运行web项目(不涉及云服务)。
  • 我在本地主机和生产中都使用相同的Facebook测试用户。
  • 在Facebook端,一切看起来都很正常,应用程序被添加到用户的应用列表中,并拥有所有的权限。这不是facebook的拒绝。
  • 甚至移除了Application (因为这在生产中是不同的),但是它并没有影响问题。

查看Chrome中的DevTools:

  • 缓存控制看起来一切正常,所有的无缓存。
  • .AspNet.Correlation.Facebook cookie被设置并在完成时(相同的值)从Facebook返回到signin端点。请注意,没有其他与Owin相关的cookie。

Re.部署:

  • Azure云服务由单个web角色组成。
  • 蔚蓝云服务osFamily="5“osVersion=*
  • 部署直接从Visual执行到暂存槽(右击“发布”)。
  • 我通常对暂存槽执行交互式登录,当事情升温时,我使用Azure门户来交换插槽。对Facebook登录名的测试只在生产时隙上进行(不分阶段)。

下面是显示处理的代码片段(ChallengeResult是当前的WebApplication模板代码)。控制器被标记为OutputCache(Location = OutputCacheLocation.None),没有标记为授权

代码语言:javascript
运行
复制
    // POST: /Membership/ExternalSignupDispatch (They clicked to login with Facebook, Google, etc.)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalSignupDispatch(string provider, string community = Communities.Dating)
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalSignupCallback1", "Membership", new { community }));
    }

    // GET: /Membership/ExternalSignupCallback
    public async Task<ActionResult> ExternalSignupCallback1(string community = Communities.Dating)
    {
        var info = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (info == null) // Unsuccessful login
        {

制作服务器上Owin/Facebook的无声故障令人恼火。如果有错误枚举..。或者一个例外..。但是唉

任何想法都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2019-03-04 21:48:18

所以。事实证明,如果没有预先存在的ASP.NET_SessionID cookie,Owin目前将以神秘的方式失败。没有它,signin函数不会删除.Aspnet.Correlation.Facebook cookie,也不会设置.Aspnet.ExternalCookie cookie。会话ID cookie的不存在在某种程度上阻止了所需的cookie处理。所有这些都为间歇性无声故障设置了舞台,这取决于客户端的cookie状态。

解决方法是在使用Facebook登录生成表单时存储一个假会话变量,强制在登录SessionID之前创建cookie。

注意,我们正在使用SystemWebCookieManager (希望避免此类cookie问题)。事情似乎还在发展。

作为参考,下面是我们的ConfigureAuth函数中的cookie设置:

代码语言:javascript
运行
复制
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            CookieManager = new SystemWebCookieManager(), 
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            ExpireTimeSpan = TimeSpan.FromMinutes(Params.LoginExpiryMinutes), 
            SlidingExpiration = true,
            LoginPath = new PathString("/Login"),
            Provider = new CookieAuthenticationProvider // Used to allow returning 401 Unauthorized status to API calls, instead of 302 redirect
            {
                OnApplyRedirect = ctx =>
                {
                    if (!IsAjaxRequest(ctx.Request))
                    {
                        ctx.Response.Redirect(ctx.RedirectUri);
                    }
                }
            }
        });

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54953058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档