解析数据库授权 - 用户对象的安全性

时间:2013-12-15 15:38:28

标签: c# asp.net-mvc-4 parse-platform

我有一个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

请您提出解决这个非常严重问题的解决方案吗?谢谢。

1 个答案:

答案 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);
}