0

1 つのユーザー名が複数の会社に属することができるアプリケーションがあります。したがって、それらを区別するには、ログインするための一意のペアとしてユーザー名とパスワードの両方を使用する必要があります。

ASP.NET MVC を使用していますが、ログインが発生する場所を理解するのに苦労しています。実際、ユーザーを検証する場所はわかりますが、ユーザーを取得する場所はわかりません。

だからどこに

ユーザー名=xx、パスワード=xx のユーザーを選択しますか?

別の質問: ユーザーが設定されている場所が見つかりませんでしたか? コードに User.Identity.Name が表示されますが、表示されません: User=Select....

ありがとうジョン

4

2 に答える 2

3

ジョン、あなたは MVC を使用しています。LINQ 構文を除いて、コード内にクエリが表示されることはありません。あなたがやろうとしていることは、User テーブルと Company テーブルの間の多対多の関係だと思います。(1 人のユーザーには複数の会社があり、1 つの会社には複数のユーザーがいます) データベースに関しては、Company と Users の両方の主キーを持つ追加のテーブルが必要であることを意味します。

あなたの質問に戻ります。ASP.net MVC には、独自のメンバーシップ プロバイダーがあります。独自のテーブルで既定のものを使用するか、それを上書きして独自のカスタム メンバーシップ プロバイダーを作成するかを選択できます(独自のユーザー テーブルを使用する機能を備えています)。

デフォルトのものには、基本的な属性のほとんどが含まれているはずです。(パスワードのリセット、パスワードのソルト、メールなど) http://www.asp.net/web-forms/tutorials/security/membership/creating-the-membership-schema-in-sql-server-cs にスキップステップ: Application Services をインストールしてテーブルを生成する

ただし、独自のユーザーテーブルを持つデータベースが既にあると推測します。カスタム メンバーシップ クラスを上書きする必要があります。

簡単に言えば、これは、抽象クラス「MembershipProvider」から継承する新しいクラスを作成することを意味します。

public class MyMembershipProvider : MembershipProvider
{ 

}

その後、デフォルトのメンバーシッププロバイダーをweb.configで上書きすることを asp に通知する必要があります。

<membership defaultProvider="MyMembershipProvider">
      <providers>
        <clear />
        <add name="MyMembershipProvider"
             applicationName="MyApp"
             Description="My Membership Provider"
             passwordFormat="Clear"
             connectionStringName="MyMembershipConnection"
             type="MyApp.MyMembershipProvider" />
      </providers>
    </membership>

メンバーシップ プロバイダーの一部のメソッドでは、 MembershipUserのオブジェクトを返すか使用する必要があります。これを実装する方法はすべてここにあります: http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.aspx これは必須の手順ではありませんが、推奨されます。

頑張ってジョン:)説明に混乱がある場合は、遠慮なく質問してください

于 2012-10-04T17:32:55.223 に答える
1

簡潔な答え:

あなたが説明しているコードは、アカウント コントローラーの LogOn アクションの舞台裏で発生します。

MembershipService.ValidateUser(model.UserName, model.Password)

有効なユーザーに対して true を返します。ユーザーは、コードの次の行で「サインイン」されます。

FormsService.SignIn(model.UserName, model.RememberMe)

(Models フォルダーの下の AccountModels ファイルで定義されているこれらの関数の両方を確認できます)。

ユーザーの認証中に会社 ID も確認する場合は、ValidateUser を置き換える独自の認証メソッドを作成する必要があります。これは、ストアに何を使用しているかによって異なります (SQL?)

ただし、広い意味でのベスト プラクティスとして、異なるユーザーに同じユーザー名を使用することは許可しないでください。それはただの悪い考えであり、トラブルにつながります。

アップデート:

これを行う方法をお勧めする場合は、ASP.NET メンバーシップの UserProfile の側面を使用することをお勧めします。追加のユーザー変数 (会社など) をキャプチャして保存するように設計されていますが、作成された適切に構築された安全なメンバーシップを引き続き使用します。それを読んでください、しかし以下は私が現在取り組んでいるアプリの私の CreateUser 関数です。プロファイルを使用して姓名と、ユーザーがパスワードのリセットを必要とするフラグを保存する方法に注意してください。

繰り返しますが、これは同じユーザー名を持つ複数のユーザーを持つ機能を無効にしますが、それは避けるべきだと本当に思います.

[HttpPost]
public ActionResult CreateUser(string username, string email, string first, string last, string role)
{            
    string password;
    MembershipUser user;

    //Generate a random password
    password = Auth.CreateRandomPassword(6);

    try
    {
        //Create the user
        user = Membership.CreateUser(username, password, email);

        //Add the user to the chosen role
        Roles.AddUserToRole(username, role);

        //Create the user profile
        UserProfile profile = UserProfile.GetUserProfile(username);

        profile.FirstName = first;
        profile.LastName = last;
        profile.ForcePasswordReset = true;

        profile.Save();

        EmailNewUser(username, email, password);

    }
    catch (Exception ex)
    {                
        HttpContext.Response.StatusCode = 500;
        HttpContext.Response.StatusDescription = ex.Message;
        HttpContext.Response.Clear();
    }

    return PartialView("UserTable", Auth.Users());

}
于 2012-10-04T17:31:59.537 に答える