我使用OWIN Middleware在我的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可以使用。
这里发生的事情与JuneT注意到的有关。这与CookieAuthenticationOptions.CookieSecure == CookieSecureOption.SameAsRequest上的默认值有关。自从您从http开始,最后的重定向是http。创建'authcookie'的请求是来自AAD的https。
我能够通过设置CookieSecure == CookieSecureOption.Always来实现这一点。这意味着cookie可能会与您的身份验证一起泄漏。
是否必须有一种方法可以确保auth仅接受https连接的页面。
我昨晚在ASP.NET Framework 4.5.1 MVC应用程序中遇到了这个问题。对我来说有两个问题。
在我发现修复之前,我是“我尝试了一切,但没有任何作用”。希望这也适合你。
通过确保请求在重定向到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 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));
}