Azure OpenID通过OWIN中间件连接,产生无限重定向循环

时间:2014-12-17 12:23:40

标签: asp.net-mvc azure oauth-2.0 openid owin

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

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

Fiddler loop

我确保以下密钥正确匹配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在其中。

5 个答案:

答案 0 :(得分:1)

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

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

是否必须有办法确保授权的网页仅接受https上的连接。

答案 1 :(得分:1)

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

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

Reference Link

答案 2 :(得分:0)

通过确保请求在重定向到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);
                                    },
                },
            });

答案 3 :(得分:0)

我遇到了同样的问题并使用nuget package 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));
}

答案 4 :(得分:0)

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

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

    • 我有在HTTPS下运行的localhost,dev和测试(当然还有产品)环境,因此我不必担心在本地处理HTTP。我有无处不在的HSTS,这解决了这个问题。有关更多信息,请参见Best way in asp.net to force https for an entire site?
  2. 此处https://github.com/aspnet/AspNetKatana/wiki/System.Web-response-cookie-integration-issues

    中所述的Cookie覆盖
    • 对我有用的是重新配置CookieAuthenticationMiddleware以直接写到System.Web的cookie集合修复程序,结合 Katana 3.1.0可以使用ICookieManager的几种实现。旧版本可以使用以下修复程序。

在找到该修复程序之前,我是一个“我尝试了一切,但没有任何效果”的开发人员。希望这对您也有用。