我有一个ASP.NET MVC 4 Web应用程序,我在后端使用Parse作为数据库(https://www.parse.com/),使用C#作为编程语言。
我使用ParseUser类登录注册用户(https://www.parse.com/docs/dotnet_guide#users-login),如下所示:
ParseUser.LogInAsync("my_username", "my_password");
然后我创建了一个自定义授权属性,并将其应用于我项目的一些控制器和操作方法。
public class AuthorizeParseUserAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (ParseUser.CurrentUser != null && ParseUser.CurrentUser.IsAuthenticated)
{
return true;
}
return false;
}
}
这是Parse的CurrentUser属性https://www.parse.com/docs/dotnet_guide#users-current
的文档所以,我有以下问题:我使用我的凭据成功登录。登录后,我进入我的应用程序的主页面(AuthorizeParseUserAttribute已应用于相应的操作方法)。然后我将这个主页的URL发送给另一个人,在另一台计算机上,用户(甚至不是注册用户)可以看到我的应用程序的主页,并使用我的凭据登录! Parse的用户对象安全性文档如下https://www.parse.com/docs/dotnet_guide#users-security
请您提出解决这个非常严重问题的解决方案吗?谢谢。
答案 0 :(得分:3)
Parse SDK for .NET假设您正在构建一个在每个用户的一台设备上运行的应用程序 - 它不是为与ASP.NET集成而设计的。
来自the docs:
每当您使用任何注册或登录方法时,用户都会缓存在磁盘上。
ParseUser.CurrentUser是一种静态方法,它将缓存的用户从最近的调用返回到注册或登录方法。这就是为什么在您的代码中,在一个用户登录后,发出请求的其他人也以该用户身份登录!
我正在尝试将Parse与我正在开发的ASP.NET MVC站点集成。我解决这个限制的计划是在使用Parse登录后设置身份验证cookie,然后注销用户(他们的身份验证cookie仍将设置)。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginModel model, string returnUrl)
{
ParseUser user;
try
{
user = await ParseUser.LogInAsync(model.UserName, model.Password);
}
catch (ParseException e)
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
FormsAuthentication.SetAuthCookie(user.Username, model.RememberMe);
ParseUser.LogOut();
return RedirectToLocal(returnUrl);
}
Register方法如下所示:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
var user = new ParseUser
{
Username = model.UserName,
Password = model.Password,
};
await user.SignUpAsync();
FormsAuthentication.SetAuthCookie(model.UserName, false);
ParseUser.LogOut();
return RedirectToAction("Index", "Home");
}
catch (ParseException e)
{
ModelState.AddModelError("", e.Message);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}