不,你不需要重新发明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();
}
}