Использование Kentor + проверка подлинности Windows на IdentityServer3

У меня есть IdentityServer3, работающий со службой аутентификации Windows. Теперь я хочу обработать протокол SAML2 на моем IdentityServer3 и увидел, что Кентор может сделать это для меня.

Проблема в том, что Kentor использует OpenID Connect во всех примерах, я искал некоторое время, но не смог найти никакой документации о том, как объединить Kentor с WindowsAuth. После многих попыток, но безуспешно, я прихожу сюда, чтобы спросить, реально ли это возможно и как?

Вот моя (нерабочая) конфигурация в Startup.cs:

public void Configuration(IAppBuilder appBuilder)
{
    appBuilder.Map("/windows", ConfigureWindowsTokenProvider);
    appBuilder.UseIdentityServer(GetIdentityServerOptions());
}

private void ConfigureWsFederation(IAppBuilder pluginApp, IdentityServerOptions options)
{
    var factory = new WsFederationServiceFactory(options.Factory);

    factory.Register(new Registration<IEnumerable<RelyingParty>>(RelyingParties.Get()));
    factory.RelyingPartyService = new Registration<IRelyingPartyService>(typeof(InMemoryRelyingPartyService));
    factory.CustomClaimsService = new Registration<ICustomWsFederationClaimsService>(typeof(ClaimsService));
    factory.CustomRequestValidator = new Registration<ICustomWsFederationRequestValidator>(typeof(RequestValidator));

    var wsFedOptions = new WsFederationPluginOptions
    {
        IdentityServerOptions = options,
        Factory = factory,
    };

    pluginApp.UseWsFederationPlugin(wsFedOptions);
}

private IdentityServerOptions GetIdentityServerOptions()
{
    DefaultViewServiceOptions viewServiceOptions = new DefaultViewServiceOptions();
    viewServiceOptions.CustomViewDirectory = HttpContext.Current.Server.MapPath("~/Templates");
    viewServiceOptions.Stylesheets.Add("/Content/Custom.css");

    IdentityServerServiceFactory factory = new IdentityServerServiceFactory()
        .UseInMemoryClients(new List<Client>())
        .UseInMemoryScopes(new List<Scope>());

    factory.ConfigureDefaultViewService(viewServiceOptions);
    factory.UserService = new Registration<IUserService>(resolver => new UserService());

    return new IdentityServerOptions
    {
        SigningCertificate = Certificate.Load(),
        Factory = factory,
        PluginConfiguration = ConfigureWsFederation,
        EventsOptions = new EventsOptions
        {
            RaiseSuccessEvents = true,
            RaiseFailureEvents = true,
        },
        AuthenticationOptions = new IdentityServer3.Core.Configuration.AuthenticationOptions
        {
            IdentityProviders = ConfigureIdentityProviders,
            EnableLocalLogin = false,
        },
        RequireSsl = true,
    };
}

private void ConfigureIdentityProviders(IAppBuilder app, string signInAsType)
{
    ConfigureWSFederationProvider(app, signInAsType);
    ConfigureKentorProvider(app, signInAsType);
}

private void ConfigureKentorProvider(IAppBuilder app, string signInAsType)
{
    SPOptions spOptions = new SPOptions
    {
        EntityId = new EntityId("Dropbox"),
    };
    KentorAuthServicesAuthenticationOptions kentorOptions = new KentorAuthServicesAuthenticationOptions(false)
    {
        Caption = "Windows",
        SignInAsAuthenticationType = signInAsType,
        SPOptions = spOptions,
    };
    IdentityProvider idp = new IdentityProvider(new EntityId("http://stubidp.kentor.se/Metadata"), spOptions)
    {
        Binding = Saml2BindingType.HttpRedirect,
        AllowUnsolicitedAuthnResponse = true,
        LoadMetadata = true,
    };
    kentorOptions.IdentityProviders.Add(idp);
    app.UseKentorAuthServicesAuthentication(kentorOptions);
}

private void ConfigureWSFederationProvider(IAppBuilder app, string signInAsType)
{
    app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions()
    {
        AuthenticationType = "windows",
        Caption = "Windows",
        SignInAsAuthenticationType = signInAsType,

        MetadataAddress = serverHost + "windows",
        Wtrealm = "urn:idsrv3",
    });
}

private void ConfigureWindowsTokenProvider(IAppBuilder app)
{
    app.UseWindowsAuthenticationService(new WindowsAuthenticationOptions
    {
        IdpReplyUrl = serverHost,
        SigningCertificate = Certificate.Load(),
        EnableOAuth2Endpoint = false,
    });
}

Эта конфигурация строится, но когда я использую Dropbox SSO (используя SAML2), я получаю исключение No Idp with entity id "Dropbox" found,

1 ответ

Вы настроили Dropbox как идентификатор (EntityId в терминах SAML2) вашего приложения (в SpOptions). Это должен быть URI, который идентифицирует ваше приложение. Соглашение заключается в использовании URL-адреса метаданных (~/AuthServices).

Вам нужно добавить IdentityProvider с настройками idp в Dropbox. Также обратите внимание, что EntityId "Dropbox" не будет работать, так как стандарт SAML2 требует, чтобы Entity ID был абсолютным URI.

Другие вопросы по тегам