让我描述一下我的情况:
我们正在开发一个创建网站的网络应用程序。
它创建的每个网站都会保存在数据库中,并提供所有附加信息。
当客户浏览其中一个网站时,他实际上正在浏览根应用程序,并且使用网站ID我们知道哪些数据要发送到客户端,哪些布局 - 但都来自主根网站应用程序。
我希望创建一个用户管理&对于此系统的身份验证,FOR FOR EACH WEBSITE。
我带来的想法:
在数据库Users
表格中创建一个WebsiteID
列。
关于身份验证,我计划创建一些手动功能,在每次用户登录成功时,系统会在客户端的机器中使用WebsiteId创建一个cookie,以及一个随机的GUID,它将保存在我们的数据库中以解决安全问题(如果没有GUID,客户端可以使用websiteId手动创建cookie并破解系统)。
这就是我计划用HttpCookie类做的事情:
// int websiteId -> the current website id.
// int userId -> the user id from the DB.
HttpCookie cookie = new HttpCookie("WebsiteAuthentication" + websiteId);
cookie.Values["WebsiteId"] = websiteId.ToString();
cookie.Values["UserId"] = userId.ToString();
cookie.Values["Guid"] = "SOME_RANDOM_GUID";
当我需要检查当前用户是否经过身份验证时,我将比较客户端cookie(如果存在)和cookie的GUID与GUID在应用程序的数据库中保存。
这是解决我问题的好方法吗?它是否受到保护且足够安全?
我会很高兴知道你对此有何看法,也许我完全偏离了......
希望我能理解。谢谢大家,
半乳糖
答案 0 :(得分:1)
我认为您应该使用Membership provider(如果需要,可以创建自定义实现)。
您确实应该使用FormsAuthentication.SetAuthCookie来创建Cookie。
答案 1 :(得分:0)
正如CD所说(我在评论中写道)你可以使用会员资格来获得你想要的东西。
但是你有关于应用程序ID的问题,因为id是在web.config中指定的,因此对应用程序是全局的。这意味着您无法直接处理不同的应用程序。
您似乎可以从其中一个标准成员资格提供程序继承(SqlMembershipProvider可能最接近您的需要),并且从ineheriting类可以设置ApplicationName。 但是你当然会遇到线程问题,除非你在设置应用程序名后锁定整个语句,在这种情况下你会遇到 performance 的麻烦。
另一方面,您获得了数据库结构,存储为种子哈希的密码以及会员提供商提供的一系列其他安全最佳实践,因此我仍然建议使用SqlMembershipProvider;但您可能需要做一些更聪明的子类化或最终只实现接口并使用组合来初始化每个子应用程序的成员资格提供程序,其中应用程序名称设置正确。