大佬教程收集整理的这篇文章主要介绍了连接到 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。
我尝试过的事情:
httpContext.Connection.ClIEntCertificate
访问证书 - 这始终返回 null。WebrequestHandler
调用 .NET Core API,只是为了查看这是否确实通过证书发送 - 这也在接收端返回 null。
难道是因为我试图跨域发送证书?为此使用证书是否值得在安全方面做一些事情?任何帮助将不胜感激。
这是 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,请注明来意。