Я использую Owin для настройки своего приложения ASP.NET MVC 5 (.NET 4.5, IIS 7/8) для аутентификации в сторонней настройке ADFS:
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
});
app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
Wtrealm = Settings.Auth.Wtrealm,
MetadataAddress = Settings.Auth.MetadataAddress
});
У меня также есть собственный фильтр проверки подлинности (используется вместе с AuthorizeAttribute
):
public class OwinAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
var user = filterContext.RequestContext.HttpContext.User;
var authenticated = user.Identity.IsAuthenticated;
if (!authenticated)
{
return;
}
/* Redirect to profile setup if not already complete */
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
}
}
В половине случаев это работает нормально, но иногда при первоначальном входе между приложением и входом в ADFS возникает цикл перенаправления. Похоже, что это зависит от сеанса (не происходит для всех пользователей одновременно), и как только возникает цикл перенаправления, кажется, что он продолжается до обновления пула приложений.
Когда возникает цикл перенаправления, я все еще вижу (на вкладке Chrome Network), что выглядит как действительный токен, выдаваемый ADFS.
Мне трудно выделить основную причину, но я обнаружил, что когда цикл не возникает, user.Identity
имеет тип ClaimsIdentity
, а IsAuthenticated
- это true
. Когда это действительно происходит, IsAuthenticated
равно false
, но user.Identity
имеет тип WindowsIdentity
.
Все формы аутентификации в IIS, кроме Anonymous, отключены. IIS Express нигде не используется.
Что может быть причиной этого?