Аутентификация федерации ADFS не возвращает токен и не сохраняет куки - PullRequest
0 голосов
/ 26 июня 2018

Мы используем аутентификацию WsFederation с сервером ADFS. Большинство написанных нами приложений работают с приведенным ниже кодом (за исключением, конечно, кода отладки), но мое приложение просто не хочет работать.

Я получаю редирект на страницу входа на сервере AD, и могу без проблем ввести UserId и Password, но по возвращении должен быть сохранен файл cookie, но это не так. Результатом является то, что в следующем раунде перенаправление происходит снова (на этот раз без формы входа в систему).

Код отладки попадает только на RedirectToIdentityProvider. Никто другой не называется.

Код находится в Startup.cs для OWIN.

private static void ConfigureAuth(IAppBuilder app, ISettings settings)
{
    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);

    // Work-around to fix Katana issue 197: https://katanaproject.codeplex.com/workitem/197
    // https://github.com/KentorIT/owin-cookie-saver
    app.UseKentorOwinCookieSaver();
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
    });

    app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
    {
        Wtrealm = settings.WsFedRealm,
        MetadataAddress = settings.WsFedMetadataUrl,
        TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = ClaimsExtensions.WurNameIdentifier,
            SaveSigninToken = true,
            // ValidIssuer = settings.ValidIssuer
        },
        Notifications = new WsFederationAuthenticationNotifications
        {
            MessageReceived = context =>
            {
                Log.Info($"Message received {context.ProtocolMessage}");
                return Task.FromResult(0);
            },
            RedirectToIdentityProvider = context =>
            {
                Log.Info($"Redirect to identity provider {context?.Request?.Uri?.AbsolutePath}");
                return Task.FromResult(0);
            },
            SecurityTokenValidated = context =>
            {
                Log.Info("Security token validated");
                return Task.FromResult(0);
            },
            SecurityTokenReceived = context =>
            {
                Log.Info($"SecurityTokenReceived {context?.Response?.ReasonPhrase}");
                return Task.FromResult(0);
            },
            AuthenticationFailed = context =>
            {
                Log.Error($"Authentication failed Uri:{context.Request?.Uri} User:{context.Request?.User?.Identity?.Name}");
                context.HandleResponse();
                context.Response.Redirect("~/Error?message=" + context.Exception.Message);
                return Task.FromResult(0);
            }
        }
    });

    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;
}

1 Ответ

0 голосов
/ 10 июля 2018

Я думаю, проблема в том, что оба Middlewares имеют AuthenticationMode Active

Я рекомендую пользовательский контроллер. Если пользователь посещает этот контроллер, вы должны инициировать Аутентификацию на OwinContext.Authentication вручную для WsFederationAuthenticationDefaults.AuthenticationType и вернуть 401. Это должно вызвать ApplyResponseChallengeAsync в WsFederationAuthenticationHandler

В методе SecurityTokenValidated WsFederationAuthenticationOptions.Notifications вы можете создать новый AuthTicket с идентификатором типа CookieAuthenticationDefaults.AuthenticationType.

Теперь удостоверение от поставщика удостоверений преобразуется в локальное удостоверение с cookieauth.

...