OWIN WS-FED Пассивный выход поставщика удостоверений

Итак, у меня есть решение, использующее Microsoft.Owin.Security.WsFederation 3.0.0-rc2, и я пытаюсь получить пассивный выход, вызывая обратно поставщика удостоверений, чтобы выйти оттуда, а также мое приложение (поэтому я не получайте цикл перенаправления, просто войдя в систему).

В настоящее время я использую WAAD в качестве конечной точки WS-Fed.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/login")
});

app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ApplicationCookie);

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
    AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Passive,
    AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
    Wtrealm = ConfigurationManager.AppSettings["WSFEDRealm"],
    MetadataAddress = ConfigurationManager.AppSettings["WSFEDMetadataAddress"]
});

Я могу заставить его работать нормально, если я использую активный режим, но было бы неплохо иметь возможность использовать и пассивный.

Я выхожу, используя:

_authenticationManager.SignOut();

Я думаю, что это как-то связано с этими строками в помощнике выхода

if (revoke.AuthenticationTypes == null || revoke.AuthenticationTypes.Length == 0)
{
    return authenticationMode == AuthenticationMode.Active ? revoke : null;
}

Но я не уверен, как добавить словарь revoke.AuthenticationTypes?


person Technicolour    schedule 17.08.2014    source источник
comment
чтобы добавить authenticationType в коллекцию revoke.AuthenticationTypes, вы должны вызвать _authenticationManager.SignOut с этим authenticationType в параметре, например: если вы вызовете _authenticationManager.SignOut("ExternalCookie"), тогда у вас будет ExternalCookie в коллекции revoke.AuthenticationTypes   -  person Alexander Lysenko    schedule 23.07.2021


Ответы (1)


Потенциальное решение — принудительно выполнить запрос signout1.0 вручную.

var wsConfiguration = await _wsConfigurationManager.GetConfigurationAsync(HttpContext.GetOwinContext().Request.CallCancelled);
var message = new WsFederationMessage
{
    IssuerAddress = wsConfiguration.TokenEndpoint,
    Wtrealm = ConfigurationManager.AppSettings["WSFEDRealm"],
    Wreply = Url.Action("Index", "Home", null, Request.Url.Scheme),
    Wa = "wsignout1.0"
};

Затем у меня есть привязка в моем модуле ninject для конфигурации wsfederation.

Bind<IConfigurationManager<WsFederationConfiguration>>().ToMethod((c) =>
{
    var owinContext = HttpContext.Current.GetOwinContext().Authentication;
        return new ConfigurationManager<WsFederationConfiguration>(ConfigurationManager.AppSettings["WSFEDMetadataAddress"]);
}).InSingletonScope();

Я не на 100% доволен этим решением, так как оно означает, что для метаданных запущены два менеджера конфигурации, но это рабочее решение.

person Technicolour    schedule 18.08.2014