0

アプリケーションをホストする Web ロールがありUnity3Dます。アプリケーションには接続画面があります。他の接続画面と同様に、ログインとパスワードを入力して、アプリケーションのコア (ゲームなど) にアクセスできます。

これらの情報はすべてに保存されWindows Azure Database、管理パネルを使用してユーザーを作成できます。このパネルは別の Web ロールでホストされており、データベースにアクセスできます。

新しいユーザーを作成すると、アプリケーションでそれらの情報に接続できます。問題はない。しかし、管理パネルを使用してユーザーパスワードを変更したい場合、値はデータベースで適切に変更されますが、アプリケーションでは新しいパスワードで接続できず、古いパスワードが常に使用されます。

ユーザーの作成とパスワードの変更は、Razor Entity Framework.

私はUnity3D applicationWebロールとユーザーコントローラーにリクエストを行い、ロールが新しいパスワードではなく古いパスワードを返すため、理解できません。しかし、私のデータベースと管理パネルには新しいものがあります...これはどうしてですか? どうすればこれを解決できますか?

それは応答キャッシュの問題ですか?

ユーザーを見つけて返す方法:

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>();

次に、Unity3D への応答に次のようなヘッダーを入力します。
Response.AddHeader("data", userArray[0].data.ToString());

問題の解決に役立つ情報が必要な場合は、お尋ねください。

助けてくれてありがとう!

4

2 に答える 2

1

問題が見つかりました。これは Entity Framework が原因でした:
Entity Framework と DbContext - オブジェクト追跡
what-doesn-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 を作成し、それをパスワードを返すアクションに追加して、キャッシュを無効にしてみてください (ここで説明されているように)。

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 に答える