nopCommerce / Вход пользователя программно через API или контроллер
Я пытаюсь получить некоторую помощь с nopCommerce (используя 3.2) и как программно войти / аутентифицировать пользователя. Цель - войти в систему из мобильного приложения на основе PhoneGap. Я очень слаб в безопасности / аутентификации / и т.д., поэтому, пожалуйста, поправьте меня, если я не делаю это правильно, но вот моя стратегия...
Я продублировал действие входа nopCom в CustomerController и назвал его LoginMobile. Чтобы передать информацию о пользователе, я отправляю имя пользователя и пароль (через SSL) в кодировке Base64, затем декодирую их в контроллере, вынимаю пользователя и передаю. Это работает. Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю метод AuthenticationService.SignIn (...,...) nopCom, пользователь никогда не проходит аутентификацию, хотя метод SignIn, кажется, работает отлично. Я приведу код ниже, но он использует те же самые точные вызовы в том же контроллере. Почему пользователь не проходит аутентификацию?
Кроме того, моя стратегия входа пользователя в приложение PhoneGap состоит в том, чтобы использовать пост-вызов ajax с необходимой дополнительной информацией в заголовках для передачи информации о пользователе. В настоящее время я использую Fiddler для проверки этого, и похоже, что он работает.
[HttpPost]
public ActionResult LoginM()
{
var username = "";
var password = "";
CustomerLoginResults loginResult = new CustomerLoginResults();
var authHeader = this.ControllerContext.HttpContext.Request.Headers.Get("Authorization");
Debug.Print("authHeader >" + authHeader.ToString() + "<");
if (authHeader.StartsWith("basic", StringComparison.OrdinalIgnoreCase) &&
!string.IsNullOrWhiteSpace(authHeader))
{
Debug.Print("authHeader found with basic authentication");
var authSplit = authHeader.Split(' ');
if (authSplit[1].Length > 0)
{
var rawCredentials = authSplit[1].Trim();
var encoding = Encoding.GetEncoding("iso-8859-1");
var credentials = encoding.GetString(Convert.FromBase64String(rawCredentials));
var split = credentials.Split(':');
username = split[0];
password = split[1];
loginResult = _customerRegistrationService.ValidateCustomer(username, password);
switch (loginResult)
{
case CustomerLoginResults.Successful:
{
var customer = _customerService.GetCustomerByUsername(username);
//migrate shopping cart
_shoppingCartService.MigrateShoppingCart(
_workContext.CurrentCustomer,
customer,
true);
//sign in new customer
_authenticationService.SignIn(customer, true);
//activity log
_customerActivityService.InsertActivity("PublicStore.Login",
_localizationService.GetResource("ActivityLog.PublicStore.Login"),
customer);
break;
}
default:
{
break;
}
}
}
}
// Random test code
return Json(
new {
userguid = "0123456789",
username = username,
password = password,
loginResult = loginResult,
isAuth = this.ControllerContext.HttpContext.User.Identity.IsAuthenticated
});
}
Примечание: я пытался следовать курсу API Pluralsight, в котором рассказывается, как обеспечить безопасность API с помощью базовой аутентификации с использованием пользовательского атрибута и передачи информации через заголовки. Я был еще менее успешным с этим. Хотя я пытался использовать тот же код, что и здесь, я даже не мог заставить пользователя отображаться как зарегистрированный. По крайней мере, с помощью метода контроллера я могу заставить пользователя войти в систему должным образом. Просто включив это в случае, если кто-то пытается разобраться с подобной проблемой.
1 ответ
Моя лучшая попытка использовать предоставленную вами информацию - у вас есть проблемы с обработкой файлов cookie. SignIn устанавливает файл cookie с именем NOPCOMMERCE.AUTH, который необходимо повторно отправлять при каждом запросе, чтобы сохранить аутентификацию пользователя.
Я предлагаю использовать Fiddler, как вы делаете сейчас, чтобы проверить наличие этого куки.
- Сервер отправляет файл cookie в приложение после успешного входа в систему?
- Приложение отправляет его снова на сервер для следующего запроса?
Проблема и решение в обоих случаях различны.
С уважением.