この問題についてはここにいくつかのスレッドがありますが、それらのほとんどは古く、それらの参照リンクはさらに古くなっています。
デフォルトのasp.netメンバーシッププロバイダー構造を使用して、独自のテーブル構造を使用して外部SQLサーバー(mssql)に接続する必要があるこのWebサイトはオプションではありません。テーブルのレイアウトは本当にシンプルで、ユーザーテーブルは次のようになります(個人と呼ばれます)
Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)
必要な機能は単に誰かをログインさせることであり、残りは必要ありません:)
私はいくつかのガイドに従いましたが、それらのほとんどは時代遅れで非常に複雑です。残念ながら、msdnの例はこのパターンに従っており、ドキュメントはあまり良くありません。
だから誰かがここにコードサンプルなどを投稿する方法を示している、または喜んで投稿しているリソースを持っているなら、私はそれを感謝します。
ありがとう!
とても簡単です:
新しいクラスファイルを作成します(多層システムを使用していない場合は、プロジェクトのModelsフォルダーに)MyMembershipProvider.cs
という名前を付けましょう
System.Web.Security.MembershipProvider
からそのクラスを継承します
必要なメソッドを自動的に作成します(継承クラスのピリオド+スペース)
できた!
すべてのメソッドには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);
}
使用するすべてのメソッドに対してこれを実行します(プロジェクトをデバッグし、必要なものを確認します)-ChangePasswordQuestionAndAnswer
、DeleteUser
などのメソッドはあまり気にしないので、一部のみを使用します。 、など
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。
この問題についてはここにいくつかのスレッドがありますが、それらのほとんどは古く、それらの参照リンクはさらに古くなっています。
Framework 1.0にASP.NETが導入されて以来、Page.User/CurrentSession.User/IPrincipal/IIdentityモデルは変更されていません。 Framework 2.0では、メンバーシッププロバイダーが追加されました。これらの「古い」参照は有効なガイダンスのままです。 [〜#〜] msdn [〜#〜]