0

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

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

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

我想要一个 mvc 项目,而不是 2 个,一个用于前端,另一个用于后端

4

1 回答 1

1

不,你不需要重新发明MembershipProvider。您也不需要重新发明表单身份验证。确实,你不应该。即使对于专家来说,正确地做安全也是非常困难的。您的新提供者是否会像内置提供者一样容易受到填充预言机攻击

让我们一步一步来。

首先,为了为每个区域提供单独的身份验证票 (cookie),您可以使用允许您指定 cookie 路径的重载。SetAuthCookie设置每个 cookie 的路径,以便浏览器仅根据 URI 路径根(Frontend/Backend/,在您的情况下)为每个区域发送正确的 cookie。

AuthorizeAttribute仍将按原样工作。如果您执行上述步骤,浏览器将仅发送正确的 cookie,该 cookie 由表单身份验证签名和验证。AuthorizeAttribute只是检查当前的提供者是否已经完成了这一步,而不关心自己的实现。

重要的是我做出了一个我没有实际测试过的假设。我假设表单身份验证会根据请求路径检查签名的 cookie,以确保路径相同。如果表单还没有这样做,您将需要自己测试并实施它。就像我说的,我认为它是,但要测试以确保。

关于针对存储库的“'身份验证'”,不要混淆身份验证和授权。身份验证的意思是“你是谁?” 让表单验证做到这一点。授权的意思是“你可以做什么?” 那是您检查存储库的地方。

所以最后,你会在员工/后端区域做这样的事情:

    [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();
                }
            }
于 2011-09-01T13:05:34.330 回答