web-dev-qa-db-ja.com

.NET 4.0のカスタムMembershipProvider

この問題についてはここにいくつかのスレッドがありますが、それらのほとんどは古く、それらの参照リンクはさらに古くなっています。

デフォルトのasp.netメンバーシッププロバイダー構造を使用して、独自のテーブル構造を使用して外部SQLサーバー(mssql)に接続する必要があるこのWebサイトはオプションではありません。テーブルのレイアウトは本当にシンプルで、ユーザーテーブルは次のようになります(個人と呼ばれます)

Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)

必要な機能は単に誰かをログインさせることであり、残りは必要ありません:)

私はいくつかのガイドに従いましたが、それらのほとんどは時代遅れで非常に複雑です。残念ながら、msdnの例はこのパターンに従っており、ドキュメントはあまり良くありません。

だから誰かがここにコードサンプルなどを投稿する方法を示している、または喜んで投稿しているリソースを持っているなら、私はそれを感謝します。

ありがとう!

40
Eric Herlitz

とても簡単です:

  1. 新しいクラスファイルを作成します(多層システムを使用していない場合は、プロジェクトのModelsフォルダーに)MyMembershipProvider.csという名前を付けましょう

  2. System.Web.Security.MembershipProviderからそのクラスを継承します

  3. 必要なメソッドを自動的に作成します(継承クラスのピリオド+スペース)

できた!

すべてのメソッドにはNotImplementedException例外があります。必要なのは、それぞれを編集して独自のコードを追加することだけです。たとえば、次のようにGetUserを定義します。

public override MembershipUser GetUser(string username, bool userIsOnline)
{
    return db.GetUser(username);
}

dbは、クラスに追加したデータベースリポジトリです。

MyServicesRepository db = new MyServicesRepository();

そこには、次のようなGetUserメソッドがあります。

public MembershipUser GetUser(string username)
{
    OS_Users user = this.FindUserByUsername(username);

    if (user == null)
        return
        new MembershipUser(
            providerName: "MyMembershipProvider",
            name: "",
            providerUserKey: null,
            email: "",
            passwordQuestion: "",
            comment: "",
            isApproved: false,
            isLockedOut: true,
            creationDate: DateTime.UtcNow,
            lastLoginDate: DateTime.UtcNow,
            lastActivityDate: DateTime.UtcNow,
            lastPasswordChangedDate: DateTime.UtcNow,
            lastLockoutDate: DateTime.UtcNow);

    return
        new MembershipUser(
            providerName: "MyMembershipProvider",
            name: user.username,
            providerUserKey: null,
            email: user.email,
            passwordQuestion: "",
            comment: "ANYTHING you would like to pass",
            isApproved: true,
            isLockedOut: user.lockout,
            creationDate: user.create_date,
            lastLoginDate: user.lastLoginDate,
            lastActivityDate: user.lastActivityDate,
            lastPasswordChangedDate: user.lastPasswordChangedDate,
            lastLockoutDate: user.lastLockoutDate);
}

使用するすべてのメソッドに対してこれを実行します(プロジェクトをデバッグし、必要なものを確認します)-ChangePasswordQuestionAndAnswerDeleteUserなどのメソッドはあまり気にしないので、一部のみを使用します。 、など

web.configに新しいメンバーシップを次のように追加してください:

<membership defaultProvider="MyMembershipProvider">
  <providers>
    <clear/>
    <add name="MyMembershipProvider" type="Your.NameSpace.MyMembershipProvider" connectionStringName="OnlineServicesEntities"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
  </providers>
</membership>

ビデオチュートリアルはVBですが、クリスペルス(2007年の日付ですが、まだほとんど有効)からのニースビデオチュートリアルとこれのコードもありますが、手順を理解しましょう...

http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

独自のメンバーシッププロバイダーを作成しただけでなく、ロールプロバイダーも作成しました、上記のコードからわかるように、 MemberShipとしましょう。アプリケーションで次のようなものを使用します。

[Authorize(Roles = "Partner, Admin")]
public ActionResult MyAction()
{

}

そして

@if (Roles.IsUserInRole(Context.User.Identity.Name, "Admin"))
{
    <div>You're an ADMIN, Congrats!</div>
}

必要なメソッドを自動的に作成するもの(継承クラスのピリオド+スペース)

右クリックするか、名前の上にカーソルを置いて押します Control + . その後 space

62
balexandre

この問題についてはここにいくつかのスレッドがありますが、それらのほとんどは古く、それらの参照リンクはさらに古くなっています。

Framework 1.0にASP.NETが導入されて以来、Page.User/CurrentSession.User/IPrincipal/IIdentityモデルは変更されていません。 Framework 2.0では、メンバーシッププロバイダーが追加されました。これらの「古い」参照は有効なガイダンスのままです。 [〜#〜] msdn [〜#〜]

0
Cos Callis