Asp.net web api 如何从微服务实现SAML单次注销请求

Asp.net web api 如何从微服务实现SAML单次注销请求,asp.net-web-api,microservices,itfoxtec-identity-saml2,Asp.net Web Api,Microservices,Itfoxtec Identity Saml2,我已经在我的应用程序中实现了多租户SAML SSO。我正在使用一个单页应用程序,该应用程序具有AngularJS中的UI、Web API(用于断言URL)和用于创建和处理SAML请求的微服务。我在我的微服务中使用Itfoxtech库 我已经成功实现了SAML SSO登录,并且工作正常。但是,在实现SAML单次注销时,我面临一些问题。关于SAML断言,我只是提取了一些声明并将它们返回给WebAPI。注销时,我似乎需要ClaimsIdentity和HttpContext。我在SAML断言期间保留了C

我已经在我的应用程序中实现了多租户SAML SSO。我正在使用一个单页应用程序,该应用程序具有AngularJS中的UI、Web API(用于断言URL)和用于创建和处理SAML请求的微服务。我在我的微服务中使用Itfoxtech库

我已经成功实现了SAML SSO登录,并且工作正常。但是,在实现SAML单次注销时,我面临一些问题。关于SAML断言,我只是提取了一些声明并将它们返回给WebAPI。注销时,我似乎需要ClaimsIdentity和HttpContext。我在SAML断言期间保留了ClaimsIdentity,并在注销期间重新使用它,但我没有访问HttpContext的权限。我已经从DefaultHttpContext创建了一个自定义httpContext,并尝试执行以下代码行

var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);
但它给出了一个错误

No sign-out authentication handlers are registered. Did you forget to call AddAuthentication().AddCookies

我的问题是,如何在不使用HttpContext的情况下执行单个注销,或者如果需要,那么如何手动创建它?

执行注销SAML 2.0需要NameID、NameID格式和会话索引。为了实现这一点,您可以使用声明来处理索赔:
Saml2ClaimTypes.NameId
Saml2ClaimTypes.NameIdFormat
Saml2ClaimTypes.SessionIndex

在单次注销的情况下,您只需验证请求:

Saml2StatusCodes status;
var requestBinding = new Saml2PostBinding();
var logoutRequest = new Saml2LogoutRequest(config, User);
try
{
    requestBinding.Unbind(Request.ToGenericHttpRequest(), logoutRequest);
    status = Saml2StatusCodes.Success;
    //TODO handle logout
}
catch (Exception exc)
{
    // log exception
    Debug.WriteLine("SingleLogout error: " + exc.ToString());
    status = Saml2StatusCodes.RequestDenied;
}
并回应:

var responsebinding = new Saml2PostBinding();
responsebinding.RelayState = requestBinding.RelayState;
var saml2LogoutResponse = new Saml2LogoutResponse(config)
{
    InResponseToAsString = logoutRequest.IdAsString,
    Status = status,
};
return responsebinding.Bind(saml2LogoutResponse).ToActionResult();
您不需要调用
DeleteSession(HttpContext)
,但需要以某种方式处理注销