繁体   English   中英

通过 OWIN 中间件的 Azure OpenID 连接导致无限重定向循环

[英]Azure OpenID Connect via OWIN Middleware resulting in Infinite Redirect Loop

我已经使用 OWIN 中间件在我的 ASP.NET MVC 应用程序中设置了 OpenID Connect 身份验证。

正如此 Fiddler 输出所示,一旦通过 Azure OpenID Connect 成功登录,浏览器就会不断在我的 site.azurewebsites.net 和 login.windows.net 之间来回循环。

提琴手循环

我已确保以下键正确匹配 Azure AD 信息

<add key="ida:AADInstance" value="https://login.windows.net/{0}" />
<add key="ida:Tenant" value="******.onmicrosoft.com" />
<add key="ida:ClientId" value="*******" />
<add key="ida:PostLogoutRedirectUri" value="*********" />

而我的 Start.cs 代码如下

 private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];

    private string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

    IAuthorizationService authorizationService = new AuthorizationService();

    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {

            ExpireTimeSpan =TimeSpan.FromMinutes(15)
        });

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri}
            });
    }
}

不知道是什么导致这个不断重定向。 我已经在 MVC 控制器上放置了一个[Authorize]属性,其中 Post Authentication Redirect Url 去。

我昨晚在 ASP.NET Framework 4.5.1 MVC 应用程序中遇到了这个问题。 对我来说有两个问题。

  1. 尝试使用 HTTP 而不是 HTTPS 访问站点

  2. 此处描述的 Cookie 覆盖https://github.com/aspnet/AspNetKatana/wiki/System.Web-response-cookie-integration-issues

    • 对我有用的重新配置 CookieAuthenticationMiddleware 以直接写入 System.Web 的 cookie 集合修复程序,结合Katana 3.1.0 有几个可用的 ICookieManager 实现。 旧版本可以使用以下修复程序。

我是一个“我尝试了一切,但没有任何效果”的开发人员,直到我找到了解决办法。 希望这也适用于您。

这里发生的事情与 JuneT 注意到的有关。 这与 CookieAuthenticationOptions.CookieSecure == CookieSecureOption.SameAsRequest 的默认值有关。 因为你是从 http 开始的,所以最后的重定向是到 http。 创建“authcookie”的请求是来自 AAD 的 https。

我能够通过设置 CookieSecure == CookieSecureOption.Always 来实现这一点。 这意味着 cookie 可能会与您的身份验证一起泄漏。

是否必须有一种方法来确保 auth 页面只接受 https 上的连接。

要解决此问题:您可以升级应用程序以使用 ASP.NET Core。 如果您必须继续使用 ASP.NET,请执行以下操作: 将您的应用程序的 Microsoft.Owin.Host.SystemWeb 包更新为至少版本。 修改您的代码以使用新的 cookie 管理器类之一,例如如下所示:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = "Cookies", 
    CookieManager = new Microsoft.Owin.Host.SystemWeb.SystemWebChunkingCookieManager() 
});

参考链接

通过确保请求在重定向到 Azure 之前使用 https 来解决此问题

            app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = AppConfig.ClientId,
                Authority = AppConfig.Authority,

                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    RedirectToIdentityProvider = context =>
                       {
                           if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.AuthenticationRequest)
                           {
                               // ensure https before redirecting to Azure
                               if (!context.Request.IsSecure)
                               {
                                   context.Response.Redirect(string.Format("https://{0}{1}", context.Request.Uri.Authority, context.Request.Uri.AbsolutePath));
                                   context.HandleResponse();
                                   return Task.FromResult(0);
                               }
                           }

                           return Task.FromResult(0);
                       },

                    AuthenticationFailed = context =>
                                    {
                                        context.HandleResponse();
                                        context.Response.Redirect(AppConfig.RedirectUri + "SignInError?message=" + context.Exception.Message);
                                        return Task.FromResult(0);
                                    },
                },
            });

我遇到了同样的问题并使用 nuget 包kentor.owincookiesaver修复了它。 使用代码如下:-

public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseKentorOwinCookieSaver();//Workaround for infinite loop between webapp & login page

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(SignUpPolicyId));
app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(ProfilePolicyId));
app.UseOpenIdConnectAuthentication(CreateOptionsFromPolicy(SignInPolicyId));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM