你好,
我正在使用C#编写服务器程序,但我遇到了一个问题。当用户连接时,他的帐户已经过身份验证,等等。这一切都很好。
但问题是服务器必须使用连接用户的用户名,密码等作为参数执行大量查询和功能。如果我只有一个客户端,这不会是一个问题,但多线程和多个连接使这成为一项艰巨的任务。
目前我有几个功能,我必须这样调用:(主要出于安全原因)
functionName(action, value, username, password)
这对我来说似乎有些过分,因为我必须在一个1弦中使用这个功能5-6次。
我想我只是在寻找一种很好的方法来存储多个连接用户的信息,而不会让线程混淆信息。
感谢您的时间。
我目前正在做的事情:
就像我之前说的那样,此时客户端总是将他的用户名和加密密码发送到服务器。并且用户名和密码将始终作为大多数方法的参数添加,因此我可以检查数据库以查看数据是否正确。
它使代码看起来很糟糕和多余。
修改
此时用户将使用他的密码和用户名登录。然后我加密信息并以数据包的形式发送。
服务器解密信息并检查数据库中的用户名和密码。
之后我创建GUID并将其发送回客户端,以便它可以保存ID并将其添加到每个后续数据包中。
现在我如何(服务器端)检查来自客户端的数据包中的GUID是否是合法的服务器端? - 我只是暂时将GUID存储在数据库中吗?
答案 0 :(得分:2)
您可以考虑创建一个返回安全令牌的验证方法,可能是GUID
Guid Authenticate(username, password)
并在方法中传递它而不是username.password
functionname(action, value, securityToken)
答案 1 :(得分:2)
我认为你认为这一切都错了。您只需要在登录时发送用户密码,之后就忘了。如果要检查用户身份,请使用其唯一标识符。
答案 2 :(得分:1)
我在这样的场景中所做的通常是让用户首先使用他们的用户名/密码登录并返回一个令牌,他们可以使用这些令牌代替后续调用。令牌具有到期时间,您还可以将其绑定到其IP以获得额外的安全性
你可以做的一件聪明的事情是包含一个哈希作为令牌的一部分,这样你可以做一个初步的检查,如果令牌有效而没有点击数据库,比如你的令牌是
dsklfgjkgjdlg,你有一个秘密令牌哈希字符串,比如“craemefraice”,你用你的秘密字符串散列令牌并将它附加到你的令牌上,这样它就可能是dsklfgjkgjdlg:[thehash]
当您想要检查令牌时,您只需将字符串拆分为:,使用您的秘密字符串对其进行散列并检查它是否与令牌匹配。如果不是,则无效,如果是,则根据数据库检查凭证
答案 3 :(得分:0)
如果我理解正确你可以创建一些类并首先用参数username,password实例化它,那么它只有只有2个参数的functionName(action,value)方法,你会像现在一样调用它5一个字符串中的-6次(??)和里面它将调用实际的functionName,其中有4个参数从其字段中添加这两个参数。
类似于SecureFunctionCaller sfc = SecureFunctionCaller(用户名,密码); sfc.functionName(动作,值)。
您可能必须将所有这些功能复制到此类,因此它取决于数字。您还可以创建一个User对象,并在其中包含用户名和密码,如果更好的话,可以使用3个参数函数而不是4个参数。
ps:那就是说我同意你可能会把所有错误的架构明智地做到,但是很少有信息难以猜测PPS:在您编辑之后,现在应该首先对用户进行身份验证,以便他有一个安全令牌,然后使用它而不是两个参数我认为您在服务器而不是客户端上描述方法调用。