ASP.NET MVC - Перенаправление на правильный поставщик членства - PullRequest
2 голосов
/ 26 августа 2011

У меня есть приложение ASP.NET MVC 3 с функциями покупателя и продавца. Базы данных о безопасности покупателя и продавца разделены, и для каждого существуют разные поставщики членства (с разными требованиями). Приложение MVC разбито на области: одно для покупателей и одно для продавцов (с добавлением некоторых общих вещей). Сейчас все работает нормально, поскольку у меня есть разные экраны входа для покупателей и продавцов. Требование изменилось, поэтому мне нужно использовать один и тот же экран входа в систему (и экран сброса пароля) как для покупателей, так и для продавцов.

В идеале я бы хотел, чтобы процесс проходил следующим образом:

  • Покупатель или продавец вводит свой адрес электронной почты и пароль
  • После отправки формы общее действие контроллера называется
  • Действие вызывает логику для просмотра в таблице покупателя. Если этот адрес электронной почты присутствует, перенаправьте на вход в систему в контроллере учетной записи покупателя
  • В противном случае, если адрес электронной почты присутствует в таблице продавца, перенаправить на вход в систему в контроллере учетной записи продавца

Теоретически это должно работать нормально. Однако я знаю, что невозможно перенаправить на другое действие с помощью запроса POST.

Я хотел бы знать следующее:

  1. Есть ли какая-либо причина, чтобы не изменять мои действия входа покупателя / продавца для использования GET, а не POST, учитывая, что они не будут вызываться где-либо еще в моем коде? Это похоже на взлом, но я не знаю почему ...
  2. Можете ли вы придумать лучший способ достичь того, чего я пытаюсь достичь?

Заранее спасибо,

* 1 028 * JP

1 Ответ

1 голос
/ 26 августа 2011

У вас должен быть один LoginController. Может иметь только одно Authorize(string email, string password) действие. Вы делаете «разделение», создавая MembershipProviderFactory (или как вы хотите его назвать), который возвращает интерфейс IMembershipProvider вашему контроллеру. Фабрика может вернуть правильный тип MembershipProvider, запросив базы данных.

public class SellerMembershipProvider : IMembershipProvider
{
  public bool Authorize(string email, string password)
  {
    // validate seller
  }
}

public class BuyerMembershipProvider : IMembershipProvider
{
  public bool Authorize(string email, string, password)
  {
    // validate buyer
  }
}

public class MembershipProviderFactory
{
  public IMembershipProvider Create(string email)
  {
     if(/* email is in seller database*/)
     {
       return new SellerMembershipProvider();
     }
     else
     {
       return new BuyerMembershipProvider();
     }
  }
}

public class LoginController : Controller
{

  private readonly MembershipProviderFactory _providerFactory = new MembershipProviderFactory();
  public ActionResult Authenticate(string email, string password)
  {

    IMembershipProvider provider = _providerFactory.Create(email);
    if(provider.Authorize(email, password))
    {
    return View("MyAccount");
    }
    else
    {
        return View("Login");
    }
  }
}
...