Назад | Перейти на главную страницу

Ошибка выхода ADFS с кодом ID4037: ключ, необходимый для проверки подписи, не может быть разрешен из следующего идентификатора ключа безопасности

У нас есть собственное веб-приложение A и стороннее веб-приложение B. Оба являются проверяющими сторонами на нашем локальном сервере ADFS 4.0 в центре обработки данных Windows 2019.

Webapp A использует WS-Federation, а webapp B, вероятно, использует SAML 2.0, но не уверен на 100%. Webapp A не имеет сертификата подписи. Webapp B имеет действующий сертификат подписи.

Пользователь может войти в webapp A и webapp B и выйти без каких-либо проблем, если это происходит в разных сеансах браузера.

Но если пользователи находятся в веб-приложении A и открывают другую вкладку браузера, чтобы перейти в веб-приложение B, и пытаются выйти из веб-приложения A, они получают сообщение об ошибке «MSIS7054: выход из SAML не завершен должным образом».

И средство просмотра событий ADFS показывает следующее исключение:

The Federation Service encountered an error while processing the SAML authentication request. 

Additional Data 
Exception details: 
Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: ID4037: The key needed to verify the signature could not be resolved from the following security key identifier 'SecurityKeyIdentifier
    (
    IsReadOnly = False,
    Count = 1,
    Clause[0] = Microsoft.IdentityServer.Tokens.MSISSecurityKeyIdentifierClause
    )
'. Ensure that the SecurityTokenResolver is populated with the required key.
   at Microsoft.IdentityModel.Protocols.XmlSignature.EnvelopedSignatureReader.ResolveSigningCredentials()
   at Microsoft.IdentityModel.Protocols.XmlSignature.EnvelopedSignatureReader.OnEndOfRootElement()
   at Microsoft.IdentityModel.Protocols.XmlSignature.EnvelopedSignatureReader.Read()
   at System.Xml.XmlReader.ReadEndElement()
   at Microsoft.IdentityServer.Protocols.Saml.SamlProtocolSerializer.ReadLogoutRequest(XmlReader reader)
   at Microsoft.IdentityServer.Protocols.Saml.HttpSamlBindingSerializer.ReadProtocolMessage(String encodedSamlMessage)
   at Microsoft.IdentityServer.Protocols.Saml.Contract.SamlContractUtility.CreateSamlMessage(MSISSamlBindingMessage message)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.Logout(HttpSamlMessage logoutMessage, String sessionState, String logoutState, Boolean partialLogout, Boolean isUrlTranslationNeeded, HttpSamlMessage& newLogoutMessage, String& newSessionState, String& newLogoutState, Boolean& validLogoutRequest)

Webapp A - это приложение MVC с ядром dotnet. Вот код выхода:

[Authorize]
public async Task SignOut()
{
    //redirect to /signoutcallback after signout
    await SignOutCustom("/signoutcallback");
}

[Authorize]
public async Task SignOutCustom(string redirectUri)
{
    await HttpContext.SignOutAsync("Cookies");
    var prop = new AuthenticationProperties { RedirectUri = redirectUri };

    //redirect to provided target
    await HttpContext.SignOutAsync("WsFederation", prop);
}

[AllowAnonymous]
public ActionResult SignOutCallback()
{
    if (User.Identity.IsAuthenticated)
    {
        // Redirect to home page if the user is authenticated.
        return RedirectToAction("Index", "Home");
    }

    return View();
}