为了账号安全,请及时绑定邮箱和手机立即绑定

验证信号集线器连接

验证信号集线器连接

C#
慕仙森 2023-06-25 13:49:53
****我使用.Net框架,而不是Core****我有一个连接到服务器并订阅某些集线器功能的网络界面。我正在尝试找到一种方法来限制对服务器的订阅,因此只有具有正确令牌的客户端才能连接和订阅。这是我的服务器端:Startup.cs:public class Startup    {        public void Configuration(IAppBuilder app)        {            app.Map("/signalr", map =>            {                map.UseCors(CorsOptions.AllowAll);                var hubConfiguration = new HubConfiguration                {                    EnableDetailedErrors = true                };                map.RunSignalR(hubConfiguration);            });        }    }我的中心课程:[HubName("CordioHub")]    public class CordioHub : Hub    {        private static IHubContext CordioHubContext        {            get            {                return GlobalHost.ConnectionManager.GetHubContext<CordioHub>();            }        }        public static void UpdateClient(string message)        {            CordioHubContext.Clients.All.UpdateClient(message);        }        public override Task OnDisconnected(bool stopCalled)        {            return Clients.All.leave(Context.ConnectionId, DateTime.Now.ToString());        }        public override Task OnConnected()        {            return Clients.All.joined(Context.ConnectionId, DateTime.Now.ToString());        }        public override Task OnReconnected()        {            return Clients.All.rejoined(Context.ConnectionId, DateTime.Now.ToString());        }        //Status page events:        public static void UpdatePatientCout(int delta)        {            CordioHubContext.Clients.All.UpdatePatientCout(delta);        }    }正如我所解释的,当客户端尝试建立第一次连接时,我想在服务器端检查令牌,并在令牌不好的情况下拒绝。多谢!
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

如果您使用自己的自定义令牌,您可以这样做:


客户端(.NET,但我想你会理解的):


var connection = new HubConnection("url", "CustomToken=SomeToken");

connection.Start().Wait();

服务器:


    public override Task OnConnected()

    {

        if(Context.QueryString["CustomToken"] != "CorrectToken")

        {

            ///Forcefully close the connection

            HttpContext.Current.Response.Close();

        }

        return base.OnConnected();

    }


查看完整回答
反对 回复 2023-06-25
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

在这种情况下,您可以使用 JWT 令牌。配置非常简单:


您Program.cs应该配置 JWT:


JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();


        services

            .AddAuthentication(options =>

            {

                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;

                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

            })

            .AddJwtBearer(cfg =>

            {

                cfg.RequireHttpsMetadata = false;

                cfg.SaveToken = true;

                cfg.TokenValidationParameters = new TokenValidationParameters

                {

                    ValidIssuer = configuration["Jwt:Issuer"],

                    ValidAudience = configuration["Jwt:Issuer"],

                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:Key"])),

                    ClockSkew = TimeSpan.Zero

                };

                cfg.Events = new JwtBearerEvents

                {

                    OnMessageReceived = context =>

                    {

                        if (context.Request.Query.TryGetValue("token", out var token)

                        )

                            context.Token = token;


                        return Task.CompletedTask;

                    }

                };

            });

配置文件:


 "Jwt": {

    "Key": "someKey",

    "Issuer": "http://yourdomain.com",

    "ExpireDays": 0,

    "ExpireHours": 1,

    "ExpireMinutes": 0

},

在 Angular 中,您应该创建拦截器,它将向每个请求添加 Authentications 标头:


@Injectable()

export class JwtInterceptor implements HttpInterceptor {

    constructor(private userContext: UserContext) { }


intercept(

    request: HttpRequest<any>,

    next: HttpHandler

): Observable<HttpEvent<any>> {

    const authToken = this.userContext.getToken();

    if (!!authToken) {

        request = request.clone({

            setHeaders: {

                Authorization: `Bearer ${authToken}`

            }

        });

    }


    return next.handle(request);

    }

}


查看完整回答
反对 回复 2023-06-25
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信