带有 ASP.NET MVC 5 应用程序的 Microsoft 身份验证循环

Posted

技术标签:

【中文标题】带有 ASP.NET MVC 5 应用程序的 Microsoft 身份验证循环【英文标题】:Microsoft Authentication loop with ASP.NET MVC 5 application 【发布时间】:2018-11-24 09:37:09 【问题描述】:

我在 Azure 上部署了一个 ASP.NET MVC 5 Web 应用程序,该应用程序存在身份验证循环。

一开始我发现这是一个HTTP 的问题,所以我从Azure 强制HTTPS。问题消失了,但在部署后一段时间又出现了。再次部署(相同版本)解决了循环,该循环会在一段时间后返回。会是什么?我应该寻找什么?

到目前为止,我已尝试在我的 Web.config 中包含以下内容

<add key="owin:AppStartup" value="false"></add>

这在我的Startup.auth.cs:

public void ConfigureAuth(IAppBuilder app)

    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions
        
            CookieSecure = CookieSecureOption.SameAsRequest,
        );
    app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri
            );

我通过使用组织帐户指定登录创建了 MVC 5 项目,并在部署配置文件中启用了相同的功能:

我不知道还有什么可以尝试的,帮助。

【问题讨论】:

信息不足。它是每次都为任何用户循环(一段时间后)还是只是有时为某人循环?尝试从一个新的隐身窗口开始并重新检查。您能否跟踪重定向并添加到问题中? 一段时间后,对于每个不再登录的用户。在每个浏览器中,隐身模式和普通模式都会循环。我会提供更多细节,但说真的,我不能把它缩小到一个模式,不是现在。所以问尽可能多的问题,也许它会给我指明正确的方向...... 尝试添加 app.Use((context, next) => context.Request.Scheme = "https"; return next(); );正如您所说,在 Azure 级别强制 https 会影响行为。 也尝试在 CookieAuthenticationOptions 和 OpenIdConnectAuthenticationOptions 中设置 CookieManager = new SystemWebChunkingCookieManager() 正如您提到的身份验证循环会在一段时间后返回,可能是由于cookie过期时间引起的?能不能在本地正常工作? 【参考方案1】:

这里也一样,我没有这个选项。您只是无法重现此问题以找到确切原因。

这就是我在此期间所做的:

AuthStartup.cs:

app.UseCookieAuthentication(new CookieAuthenticationOptions()

    CookieSecure = CookieSecureOption.Never
);

Global.asax.cs

protected void Application_BeginRequest(object sender, EventArgs e)

    if (!Request.IsSecureConnection)
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"] +
    httpContext.Current.Request.RawUrl);

覆盖授权属性:

public class AuthorizeFromHTTPAttribute: AuthorizeAttribute

   public override void OnAuthorization(AuthorizationContext filterContext)
   
       if (!filterContext.HttpContext.Request.IsSecureConnection)
       
           UriBuilder redirectUrl = new UriBuilder(
              filterContext.HttpContext.Request.Url);
           redirectUrl.Scheme = "HTTPS";
           redirectUrl.Port = 443;
           filterContext.HttpContext.Response.Redirect(redirectUrl.ToString());
           return;
       
       else
       
           base.OnAuthorization(filterContext);
       
   

从 Visual Studio 到 Azure 的新发布解决了一段时间。那么这是服务器端的东西吗??

Working InPrivate 或 InCongnito 也不能解决这个问题。或者清理你的 cookie...

【讨论】:

在使用自定义“SystemWebCookieManager”进行了一周的测试后,我希望它现在可以工作了 :-) 到目前为止,一切都很好,并且仍在工作......更多信息:link

以上是关于带有 ASP.NET MVC 5 应用程序的 Microsoft 身份验证循环的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net MVC 5 动态创建按钮并调用带有参数的 javascript 函数

ASP.NET Core 5 MVC:在模态窗口之前验证表单

Asp.Net MVC 5 Jquery 验证不适用于带有提交事件的 ajax 帖子,显示为有效表单

ASP.NET MVC 5 过滤器和注入

带有外部缓存提供程序的 ASP.NET MVC OutputCacheAttribute

带有 asp.net mvc 应用程序的 WCF 服务