程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书?

开发过程中遇到连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书的问题如何解决?下面主要结合日常开发的经验,给出你关于连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书的解决方法建议,希望对你解决连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书有所启发或帮助;

我有一个 .NET SignalR 客户端(在 www.domain1.com 下托管的 ASP.NET Web API 2 项目中),它连接到托管在 .NET Core API 中的 SignalR 集线器项目(www.domain2.com)。这两个 Web 项目都托管在 IIS 下。 API 设置为使用 JWT Bearer 作为其默认身份验证方案。 .NET 客户端可以通过指定 AccesstokenProvIDer 委托成功通过集线器进行身份验证,该委托实质上调用 API 上的登录方法并返回 JWT 令牌。我想通过使ClIEntCertificates.Add 对象上的 httpconnectionOptions 向 SignalR 请求添加客户端证书来添加额外的安全层,但无论我尝试什么,我都无法访问证书接收端(API)。从存储中检索的证书是完整证书 (.pfX)。 API 设置为使用 CORS,我允许 www.domain1.com。

我尝试过的事情:

  • 通过 .NET Core API 端的 httpContext.Connection.ClIEntCertificate 访问证书 - 这始终返回 null。
  • 在客户端使用带有证书的 WebrequestHandler 调用 .NET Core API,只是为了查看这是否确实通过证书发送 - 这也在接收端返回 null。
  • 使用 Configure certificate authentication in ASP.NET Core 中概述的步骤配置 API 以使用证书
  • 在 IIS 中为 API 站点指定“需要 SSL”选项

难道是因为我试图跨域发送证书?为此使用证书是否值得在安全方面做一些事情?任何帮助将不胜感激。

这是 SignalR 客户端设置代码:

private static HubConnection CreateHubConnection()
 {
        var certStore = new X509Store(Storename.My,StoreLOCATIOn.LocalMachinE);
        certStore.open(OpenFlags.Readonly | OpenFlags.OpenExisTingOnly);
        var certificateCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,"myThumbprint",falsE);
        X509Certificate2 cert = certificateCollection[0];

        _hubConnection = new HubConnectionBuilder()
            .WithUrl($"{_url}/signalR",(httpconnectionOptions options) =>
            {
                // This is what I am trying to get to work
                options.CLIENtCertificates.Add(cert);

                // This works fine,but I'd like to add an extra layer of security by using a certificate
                options.AccesstokenProvIDer = async () => await TryGetAccesstokenAsync();
            })
            .ConfigureLogging(builder => builder.AddDeBUG())
            .WithautomaticReconnect(new MyHubClIEntRetryPolicy())
            .build();
} 

private static async Task<String> TryGetAccesstokenAsync()
{
        String signalRLoginDetails = JsonConvert.serializeObject(new { Username = "username",password = "password" });

        var content = new StringContent(signalRLoginDetails,EnCoding.UTF8,MimeMediaTypenames.Json);

        httpResponsemessage response = await _httpClIEnt.PostAsync(_loginUrl,content);
        response.EnsuresuccessstatusCode();

        String token = await response.Content.ReadAsStringAsync();

        return token;
   }

我的 API 是这样设置的:

public voID Configureservices(IserviceCollection services)
    {
        // Other code omitted for brevity
        var key = new SymmetricSecurityKey(EnCoding.ASCII.GetBytes(appSetTings.Secret));
        services
            .AddAuthentication(options =>
            {
                options.DefaultAuthenticatescheR_567_11845@e = JwtBearerDefaults.AuthenticationscheR_567_11845@e;
                options.DefaultCh@R_801_8710@gescheR_567_11845@e = JwtBearerDefaults.AuthenticationscheR_567_11845@e;
            })
            .AddJwtBearer(options =>
            {
                options.Savetoken = true;
                options.TokenValIDationParameters = new TokenValIDationParameters
                {
                    Validissuer = appSetTings.Issuer,ValIDAudIEnce = appSetTings.AudIEnce,ValIDateIssuer = true,ValIDateAudIEnce = true,ValIDatelifetime = true,ValIDateIssuerSigningKey = true,IssuerSigningKey = key,ClockSkew = TimeSpan.FromSeconds(5),};

                options.Events = new JwtBearerEvents
                {
                    OnmessageReceived = context =>
                    {
                        var accesstoken = context.request.querY["access_token"];

                        var path = context.httpContext.request.Path;
                        if (!String.IsNullOrWhiteSpace(accesstoken) && path.StartsWithSegments(Constants.SignalR.Endpoint))
                        {
                            context.Token = accesstoken;
                        }
                        return Task.CompletedTask;
                    }
                };
            });
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书全部内容,希望文章能够帮你解决连接到 ASP.NET Core SignalR 集线器时如何指定客户端证书所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:Core连接到