我从ItFoxTec获取了这个示例测试SP代码,并从这个控制器执行SingleLogout:

[Route("SingleLogout")]
public async Task<IActionResult> SingleLogout()
{
    Saml2StatusCodes status;
    var requestBinding = new Saml2PostBinding();
    var logoutRequest = new Saml2LogoutRequest(config, User);
    try
    {
        requestBinding.Unbind(Request.ToGenericHttpRequest(), logoutRequest);
        status = Saml2StatusCodes.Success;
        await logoutRequest.DeleteSession(HttpContext);
    }
    catch (Exception exc)
    {
        // log exception
        Debug.WriteLine("SingleLogout error: " + exc);
        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();
}

当我到达这个端点时,我收到了来自ITfoxtec.Identity.Saml2.InvalidSaml2BindingException的消息

非HTTP POST方法

IdP似乎生成了一个GET请求,我不知道是否有一些配置错误.实际上,看起来是这样的:

services.Configure<Saml2Configuration>(saml2Configuration =>
            {
                
                saml2Configuration.Issuer = saml2Configuration.Issuer;
                saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);
                var entityDescriptor = new EntityDescriptor();
                var httpClientFactory = services.BuildServiceProvider().GetService<IHttpClientFactory>();
                entityDescriptor.ReadIdPSsoDescriptorFromUrl(new Uri(federationMetadata));
                if (entityDescriptor.IdPSsoDescriptor == null)
                    throw new InvalidOperationException("Error loading federation metadata.");
                saml2Configuration.SingleSignOnDestination = entityDescriptor.IdPSsoDescriptor.SingleSignOnServices.First().Location;
                saml2Configuration.SingleLogoutDestination = entityDescriptor.IdPSsoDescriptor.SingleLogoutServices.First().Location;
                saml2Configuration.SignatureValidationCertificates.AddRange(entityDescriptor.IdPSsoDescriptor.SigningCertificates);
                

            });

推荐答案

可以同时使用Saml2PostBinding(POST)和Saml2RedirectBinding(GET)绑定进行注销.

要接受GET请求,您需要将Saml2PostBinding更改为Saml2RedirectBinding.

Csharp相关问答推荐

Unity如何在PlayerPrefs中保存数据?

如何告诉自己创建的NuGet包在应用程序中发生了变化?

如何修改中间件或其注册以正确使用作用域服务?

C++/C#HostFXR通过std::tuple传递参数

. NET JSON属性自定义所需逻辑

碰撞检测与盒碰撞器,其isTrigger on问题

Azure Redis缓存与Entra ID身份验证

C#方法从AJAX调用接收NULL

使用带有WithAppOnly()请求选项的pageIterator

Blazor在FluentButton onClick事件上设置参数

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

在ASP.NET Core 8 MVC中本地化共享视图

使用switch 类型模式时出现奇怪的编译器行为

如何返回具有泛型的类?

如何从另一个类的列表中按ID取值

为什么我不能从我的异步任务方法中返回异步任务方法?

嵌套Blazor组件内的验证

.NET8支持Vector512,但为什么向量不能达到512位?

我应该使用IMhemyCache来存储承载令牌,还是应该为Azure函数中的401个错误实施Polly重试策略?

部署Aspnet Blazor服务器时出现未处理的Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]异常