0

私は最近、Webホスティングサービスで公開したasp.net MVC Webサイトを持っています。ほとんどすべてのものがうまく機能し、私のmsSQLデータベースから得た情報はページなどに表示されています。しかし、問題が1つあります。自分のWebサイトにログインしようとしても、うまくいきません。これ以上説明する前に、ユーザーログインを認証する方法を示す次のコードを確認する必要があります。

public ActionResult Login()
{
    return View();
}

[HttpPost, ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
    if (ModelState.IsValid)
    {

        if (Repository.AuthenticateLogin(model.Username, model.Password.GetHashCode().ToString()))
        {
            FormsAuthentication.SetAuthCookie(model.Username, false);
            return RedirectToAction("Index", "Home");
        }
        else
        {
            TempData["WrongLogin"] = "The username or password you've entered is wrong. Please try again!";
            return View(model);
        }
    }
    else
    {
        return View(model);
    }
}

そして、上記のif文で使用されているメソッド "AuthenticateLogin(string username、string password)は、次のようになります。

public static bool AuthenticateLogin(string username, string password)
    {
        using (var context = new SHultEntities())
        {
            return (from u in context.User
                    where u.Username == username && u.Password == password
                    select u).Any();
        }
    }

ご覧のとおり、ユーザーを認証するために、入力したユーザー名とパスワードをデータベースのユーザーテーブル内の任意のユーザーと照合しています。一致した場合、メソッドは "true"を返すか、それ以外の場合は "false"を返します。ええ、あなたはそれを手に入れました。

問題は、私のサイトにログインしようとするとTempData ["WrongLogin"]というテキストが表示されることです。これは、AuthenticateLoginメソッドがfalseを返したことを意味します。つまり、一致があってはいけません。しかし、同じユーザー名とパスワードを使用して、コンピューター上のローカルプロジェクトでこれを試すと、AuthenticateLoginはtrueを返します。

データベースへの接続に問題がある場合は、データベースから取得したヘッダーとコンテンツがサイトに表示されません。しかしそうです。また、ローカルプロジェクトから何かを更新してからWebサイトにアクセスすると、更新された情報が表示されます。だから、唯一の問題は私がログインできないということです。

これは私を狂わせるものであり、私は本当に助けをいただければと思います。

編集:私は私のウェブサイトにログインしなければならないことを言及する価値があるかもしれませんコンテンツ/情報を編集する。ローカルプロジェクトからログインして変更することができると述べたのはそのためです。その後、変更内容がWebサイトに表示されます。

発見された問題ハッシュ化されていないパスワードを使用してユーザーを作成し、そのパスワードのAuthenticateLoginから.GetHashCode.ToString()を削除しました。それから私は再発行しました。できます。問題はハッシュです。

どうすればこれを解決できますか?私はデータベースのハッシュパスワードが必要です...


  • あなたはあなたのコンテンツとアイデンティティ情報を同じデータベースに保存しますか、それともあなたは2つの別々の接続を持っていますか? - Marco
  • 同じデータベースだけ(どの種類の明らかな)の異なるテーブル。 - thejokerish
  • あなたのデータベース接続があなたの設定に入っていることを確認してください。 - Sudipta Kumar Maiti
  • "確認"の意味がよくわからないローカルでアップデートすると、データベースからすべてのアップデートが自分のサイトに届くので、正しくないはずですか。 - thejokerish
  • @Jokerishより良い方法として、パスワードをハッシュして保存するために標準的なハッシュアルゴリズムを使用してください。そうすれば、そのようなマシン特有の制約を取り除くことができます。また、強力なハッシュアルゴリズムを選択して、あなたが所有しているメンバーシップをホスティングするためのハッシュをサポートしているかどうかをホスティングプロバイダに確認し、実装に進みます。 - Siva Gopal

2 답변


2

データベースにユーザー名とパスワードをどのようにシードしましたか? password.GetHashCode()の実装がマシン固有のものである(つまり、マシン固有のsaltに依存している)場合、これがすべてのユーザーに対して一致できない理由である可能性があります。一方、ユーザーがリモート(ホスト型)環境を介して作成されている場合は、これは問題になりません。


  • 私は自分のローカルプロジェクト内からのメソッドで私のユーザーを追加しました。最初のページのコントローラーでこの方法を使用した後、プロジェクトを1回実行しました。その後、ページを表示するたびにこれが行われないように、メソッドを削除しました。しかし、ええ、ユーザーは私自身のプロジェクト内から作成されました - thejokerish
  • そうですね、その音では問題になるのは塩ではありません。何'ホストされているデータベースの照合順序ユーザー名の大文字と小文字が区別されますか。 - CalC
  • 私の最初のポストメイトで私の最新の編集をチェックしてください、私は問題を見つけました。今私の次の問題を解決する必要があります... - thejokerish
  • それでは、GetHashCode()の実装はどのようなものですか。投稿できますか、それとも単なる標準フレームワーク実装ですか? - CalC
  • 私が最初に言うことは、暗号化ハッシュの場合は、System.Security.Cryptography.HashAlgorithmまたはSystem.Security.Cryptography.KeyedHashAlgorithmクラスから派生したクラスを使用する必要があるということです。あなたの現在の問題に関して、あなたはこの投稿を見たいと思うかもしれません:stackoverflow.com/questions/8838053/…。 - CalC

0

問題は私のハッシュによるものです。偶然にも、まったく同じに見える2つの文字列は、ハッシュされたときに異なる値を生成する可能性があります。.GetHashCode()異なるマシン上(マシンが同じバージョンのフレームワークを使用している場合でも)。

詳細については、ここをクリック!

カスタマイズしたHashingクラスを使用して問題を解決しました。

リンクされた質問


関連する質問

最近の質問