2013-12-15 81 views
1

我有一個ASP.NET MVC 4 Web應用程序,我在後端(https://www.parse.com/)和C#中使用Parse作爲數據庫作爲編程語言。解析數據庫授權 - 用戶對象的安全

我用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; 
    } 
} 

這是解析對CurrentUser屬性https://www.parse.com/docs/dotnet_guide#users-current

所以,我有以下問題的文件:我成功地登錄使用我的憑據。登錄後,我進入我的應用程序的主頁面(AuthorizeParseUserAttribute已應用於相應的操作方法)。然後我發送這個主頁的URL到另一個人,在另一臺計算機和用戶(甚至不是註冊用戶)可以看到我的應用程序的主頁,並用我的憑據登錄!解析用戶對象安全性的文檔如下https://www.parse.com/docs/dotnet_guide#users-security

您能否提出任何解決方案來解決這個非常嚴重的問題?謝謝。

+0

您的屬性只返回false,你應該不會將用戶重定向到任何一個未經授權HTTP響應,或登錄頁面?在你的控制器剛剛去,是的,這是錯誤的,進行 – davethecoder

+0

@davethecoder當這個屬性返回false然後用戶被重定向到登錄頁面自動,如果這是在web.config中指定。問題是,當我沒有註銷時,ParseUser.CurrentUser.IsAuthenticated在每個客戶端的非認證用戶都返回true。 –

回答

2

解析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); 
} 

的註冊方法如下:

[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); 
}