0

我有一个托管Unity3D应用程序的 Web 角色。在应用程序中,我有一个连接屏幕。像任何其他连接屏幕一样,您可以填写您的登录名和密码以访问应用程序的核心(例如游戏)。

所有这些信息都存储在一个中Windows Azure Database,我可以使用管理面板创建用户。此面板托管在另一个 Web 角色中,并且可以访问数据库。

如果我创建一个新用户,我可以在我的应用程序中连接这些信息。没有问题。但是现在,如果我想使用管理面板更改用户密码,则数据库中的值已更改,但在我的应用程序中,我无法使用新密码连接,总是使用旧密码。

用户创建和密码更改使用Razor Entity Framework.

我不明白,因为在我Unity3D application的请求中,我向 web 角色和用户控制器发出了请求,并且该角色返回旧密码而不是新密码。但是在我的数据库和我的管理面板中有一个新的......这怎么可能?我该如何解决这个问题?

是响应缓存问题吗?

我如何找到并返回用户:

DatabaseContext db = DatabaseContextProvider.WebDatabase;
string login = Request.Form["login"]; //The login typed by user
var users = from u in db.Users where u.Login == login select u;
User[] userArray = users.ToArray<User>();

然后我用一些像这样的 Header 填充对 Unity3D 的响应
Response.AddHeader("data", userArray[0].data.ToString());

如果您需要任何可以帮助您解决我的问题的信息,请问。

非常感谢你的帮助 !

4

2 回答 2

1

发现问题,这是由实体框架引起的:
实体框架和 DbContext - 对象跟踪
http://msmvps.com/blogs/kevinmcneish/archive/2010/02/16/setting-entity-framework-mergeoptions-what-works-什么-t.aspx

DatabaseContext db = DatabaseContextProvider.WebDatabase;
string login = Request.Form["login"];
var users = from u in db.Users where u.Login == login select u;
User[] userArray = users.ToArray<User>();

现在

DatabaseContext db = DatabaseContextProvider.WebDatabase;
string login = Request.Form["login"];
ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext;
ObjectSet<User> set = objectContext.CreateObjectSet<User>();
set.MergeOption = MergeOption.OverwriteChanges;
var users = from u in set where u.Login == login select u;
User[] userArray = users.ToArray<User>();

@Sandrino Di Mattia:感谢您帮助我找到答案!

于 2012-10-08T14:30:07.353 回答
0

如果您可以在数据库中看到新密码但控制器返回旧密码,请尝试通过创建以下 ActionFilter 并将其添加到返回密码的 Action 来禁用缓存(如此处所述):

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

就在旁边,你为什么要返回密码?用户名/密码验证应该在服务器端进行,并且应该在身份验证成功后简单地返回 true/false 或令牌。从安全的角度来看,返回密码(即使经过哈希处理)并不是一个好主意。

于 2012-10-08T12:12:34.100 回答