世話をしているように見えるMehdiGolchinによる答えをここで見つけました:
[Authorize(Roles="admin,editor,publisher")]
これもホームコントローラーに追加すると、次のようになります。
[InitializeSimpleMembership]
この属性はアカウントコントローラーにあるため、SimpleMembershipデータベースは、ログイン/登録などのアカウントコントローラーを最初に使用した後にのみ初期化されます。現在のユーザーがCookieからログインしても、データベースは初期化されないため、エラーがスローされます。1つの解決策は、Webサイトを起動したときに呼び出されるホームコントローラーにこの属性を設定することです。ただし、役割を確認し、役割に基づいてさまざまなメニュー項目を表示するため、すべてのコントローラーに配置する必要があります。
データベースは最初に使用するときではなく、App_Startで初期化する必要があるため、これは不適切な設計です。
私は入れようとしました
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
で、Global.asax
Application_Start()
を使用してメニュー項目のロールチェックを処理しますが、追加の属性が適用されている場合でも、属性User.IsInRole("admin")
を持つコントローラーでエラーをスローします。[Authorize(Roles="admin")]
[InitializeSimpleMembership]
したがって、現時点での解決策は、ユーザーが外部リンクを使用して任意のページに最初にアクセスできるため、すべてのコントローラーに`[InitializeSimpleMembership]を配置することです。
SimpleRolesProviderクラスを初期化して、単なる。ではなく、より多くの役割管理を行う方法をまだ理解できませんUser.IsInRole()
。
これらのことはwebmatrixWebページサイトでうまく機能し、MVCの移植は明らかに完全ではありません。これは、デフォルトのasp.netメンバーシッププロバイダーと競合して混乱します。
EDIT OKこの行をApp_Startフォルダーに配置[InitializeSimpleMembership]
することで、フィルターをグローバルに適用できると
は思っていませんでした。FilterConfig.cs
filters.Add(new InitializeSimpleMembershipAttribute());
それはその問題の世話をします。SimpleRolesProvider初期化のソリューションが必要です。そうしないと、独自のロールプロバイダーを作成する必要があります。
アップデート:
スコットアレンによるこの投稿は私のすべての問題を解決しました。
これをweb.configに含めると、次のようになります。
<roleManager enabled="true" defaultProvider="simple">
<providers>
<clear/>
<add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
</providers>
</roleManager>
<membership defaultProvider="simple">
<providers>
<clear/>
<add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
</providers>
</membership>
RolesおよびMembershipクラスのすべてのメソッドが使用可能になり、次のようにコードで初期化できます。
var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;