我正在尝试获得一些关于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。
- 服务器是否在成功登录后将cookie发送到应用程序
- 应用程序是否会再次将其发送到服务器以进行下一次请求
这两种情况下的问题和解决方案都不同。
致以亲切的问候。