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, как вы делаете сейчас, чтобы проверить наличие этого куки.

  1. Сервер отправляет файл cookie в приложение после успешного входа в систему?
  2. Приложение отправляет его снова на сервер для следующего запроса?

Проблема и решение в обоих случаях различны.

С уважением.

Другие вопросы по тегам