ASP.NET MVC 2和Areas的独立认证会话

时间:2011-08-31 13:03:23

标签: asp.net asp.net-mvc asp.net-membership asp.net-mvc-areas authorize

我正在开发一个小型CMS网站(前端区域),用户可以在其中查看新闻,浏览产品等 在同一个网站上我有一个管理CMS内容和ERP功能的后端区域,这仅适用于公司员工 所以,我的网站分为两个区域http://WEBSITEURL/Frontend/http://WEBSITEURL/Backend/

在前端区域中,我的用户针对客户存储库进行了身份验证,但在我的后端区域,我的用户将根据公司的员工存储库进行身份验证。我想我必须写自己的MembershipProvider

我会在我的控制器中使用Authorize属性,但我想知道是否可以拥有并保留在会话2中的身份验证

我希望有一个mvc项目,而不是2个,一个用于前端,另一个用于后端

1 个答案:

答案 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();
                }
            }