asp.net mvc-nopCommerce/通过API或Controller以编程方式登录用户



我正在尝试获得一些关于nopCommerce(使用3.2)以及如何以编程方式登录/验证用户的帮助。目标是让用户从基于PhoneGap的移动应用程序登录。我在安全/身份验证等方面很弱,所以如果我做得不好,请纠正我,但这是我的策略。。。

我在CustomerController中复制了nopCom的Login操作,并将其称为LoginMobile。为了传递用户信息,我用Base64编码发送用户名和密码(通过SSL),然后在控制器中解码,取出用户并传递。这很有效。我遇到的问题是,当我调用AuthenticationService.SignIn(…,…)nopCom方法时,即使SignIn方法似乎工作得很好,用户也永远不会得到身份验证。我将把代码放在下面,但它在同一个控制器中使用了完全相同的调用。为什么用户不能通过身份验证?

此外,我在PhoneGap应用程序上登录用户的策略是使用ajax post调用,并在标头中添加必要的信息来传递用户信息。目前我正在使用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
        });
}           

旁注。。。我试图遵循Pluralsight的API课程,他们通过使用自定义属性进行基本身份验证来确保API的安全,并通过头传递信息。我在这方面更不成功。当我尝试使用与这里相同的代码时,我甚至无法让用户显示为注册用户。至少使用控制器方法,我可以让用户正确登录。只是包括这一点,以防有人试图解决类似的问题。

根据您提供的信息,我认为您在cookie处理方面存在一些问题。SignIn设置一个名为NOPCOMMERCE.AUTH的cookie,该cookie需要在每次请求时再次发送,以保持用户的身份验证。

我的建议是像现在这样使用Fiddler,检查是否存在这种cookie。

  1. 服务器是否在成功登录后将cookie发送到应用程序
  2. 应用程序是否会再次将其发送到服务器以进行下一次请求

这两种情况下的问题和解决方案都不同。

致以亲切的问候。

最新更新