我正在开发一个小型CMS网站(前端区域),用户可以在其中查看新闻,浏览产品等 在同一个网站上我有一个管理CMS内容和ERP功能的后端区域,这仅适用于公司员工 所以,我的网站分为两个区域http://WEBSITEURL/Frontend/和http://WEBSITEURL/Backend/
在前端区域中,我的用户针对客户存储库进行了身份验证,但在我的后端区域,我的用户将根据公司的员工存储库进行身份验证。我想我必须写自己的MembershipProvider
我会在我的控制器中使用Authorize属性,但我想知道是否可以拥有并保留在会话2中的身份验证
我希望有一个mvc项目,而不是2个,一个用于前端,另一个用于后端
答案 0 :(得分:1)
不,你不需要重新发明MembershipProvider
。您也不需要重新发明表单身份验证。的确,你不应该。即使对于专家来说,正确地执行安全也是非常困难的。您的新提供商是vulnerable to a padding oracle attack, like the built-in providers were吗?
让我们一步一步走。
首先,为了为每个区域分别设置身份验证票证(cookie),您可以使用the overload of SetAuthCookie
which allows you to specify a cookie path.设置每个cookie的路径,以便浏览器仅根据URI路径根为每个区域发送正确的cookie (Frontend/
或Backend/
,在您的情况下)。
AuthorizeAttribute
仍然按原样运作。如果您执行上述步骤,浏览器将仅发送正确的cookie,该cookie由表单身份验证签名和验证。 AuthorizeAttribute
只是检查当前提供程序是否已执行此步骤,而不关心实现。
重要我正在做一个我没有实际测试过的假设。我假设表单auth检查签名cookie与请求路径,以确保路径是相同的。如果表单尚未执行此操作,您将自己测试并实现它。就像我说的那样,我认为它是,但测试确定。
关于针对存储库的“'身份验证',”不要混淆身份验证和授权。身份验证意味着“你是谁?”让表格auth做到这一点。授权意味着“你可以做什么?”这是您检查存储库的地方。
所以最后,你会在员工/后端区域做这样的事情:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
if (StaffRepository.AuthorizedUser(model.UserName))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe, pathForBackend);
return RedirectTo....
}
else
{
return MyUnauthorizedAction();
}
}