以及情况......
客户已经安装了我的超级dooper winforms应用程序。 用户名和密码在应用程序启动时使用我的MSSQL服务器进行身份验证。
我想在我的网页中重定向用户并在他点击我的应用中的“更新订阅”按钮时让他“登录”(无需强迫他输入用户名和密码)网页)。
欢迎任何想法或缺点
答案 0 :(得分:1)
如果您正在为该用户打开浏览器,并且将通过HTTPS请求该页面,那么最简单的方法是在初始请求中添加基本授权标头,并使您的页面脱离该页面。 / p>
在C#中,提取名称/密码的代码如下:
string authHeader = application.Request.Headers["Authorization"];
if (authHeader.ToUpper().Contains("BASIC"))
{
//get the user's name/password
string decodedResponseString = Encoding.Default.GetString(Convert.FromBase64String(authHeader.Substring(6)));
int dividerIndex = decodedResponseString.IndexOf(':');
userName = decodedResponseString.Substring(0, dividerIndex);
password = decodedResponseString.Substring(dividerIndex + 1);
在桌面应用程序中创建标题将是上述内容,但是相反(即addheader('authorization','basic(用户名:在base 64中加密的密码)'。
使用这样的标题将是执行此操作的标准方法,但实际上您可能只需使用自定义登录算法信息创建自己的标头(或cookie)
修改的: 实际上这可能不起作用;我不确定您是否有足够的控制权来控制浏览器在请求页面时更改标题
答案 1 :(得分:1)
我建议您对架构稍作修改。
不是直接使用WinForms应用程序中的数据库进行身份验证,而是创建一个简单的Web服务,允许您传入用户名和密码,并在成功登录时接收身份验证令牌。也许这会使用户名+密码的某种哈希。
将此逻辑放在您的网站中意味着令牌生成/身份验证都包含在您的网站代码中,您可以在一个地方更改它,而不必确保WinForms部分和网站部分同步。 / p>
无论如何,WinForms应用程序可以将令牌保存在内存中,并将其传递回查询字符串(http://www.example.com/?token=08A78B2101EB4a09B2ACE8AF6D6BA993)中的网站。然后,您可以使用哈希查找用户,并以这种方式记录它们:
select user_id from users where md5(concat(username, password)) = 'TOKEN_HERE'
或者,您可以通过Web服务(可能使用GUID)在每个身份验证上唯一地生成哈希值,并将其存储在某个地方的表中以将其映射回用户ID,并使用时间戳允许您在之后使其过期一段时间。
答案 2 :(得分:0)
您是否存储了用户的会话?这就是你保持用户登录直到会话到期的方式(超时,用户注销等)。
我假设用户登录到应用程序,然后更新他们的订阅。如果不是这样,请告诉我。
答案 3 :(得分:0)
我会这样做:用户点击您应用中的“更新订阅”按钮。然后你的应用程序从你的服务器获得一个随机字符串(一个GUID或类似的东西)。然后您的应用程序打开一个地址为www.yourserver.com?token=的Web浏览器,其中token是应用程序从服务器获取的字符串。您使用该令牌来识别和授权用户。出于安全原因,此令牌应在有限时间内有效,每次用户单击按钮时都会有所不同。
免责声明:我不是安全专家,此方法可能包含明显的安全漏洞。使用风险自负。