web-dev-qa-db-ja.com

simplemembershipを使用した新しいMVC 4インターネットテンプレートでのロールベース認証

MVC 4インターネットテンプレートの新しいsimplemembership機能は、VS 2012 RTMでの外部ログイン用のOAuthへのリンクを備えています。ほとんどの場合、認証機能は機能しています。コントローラ上で動作するロールベースの認証を実装することはできません。

私はstackoverflowを検索し、グーグルで検索し、最新の John Galloway を読み、多くの提案を試みましたが、まだこの問題を解決できませんでした。すべてはSql接続エラーを取得することから始まり、接続文字列とその他すべてが適切だった理由を理解できませんでした。問題を引き起こしているのはRolesクラスであると理解するのに何時間もかかりました。

コントローラの[Authorize]属性は、基本認証の場合と同様に機能します。しかし、ロールを使用しようとすると、SQL接続エラーが発生します(デフォルトのSqlExpress aspnetdbファイルに接続しようとして失敗する古いDefaultRolesProviderに戻るため)。のようなもの:

[Authorize(Roles="admin")]

動作しません。古いasp.netメンバーシッププロバイダーに戻ると機能しますが、単純なデータベーステーブル、トークンベースの確認と回復、より安全なパスワードハッシュ、さらに重要なことにOAuthを介した外部ログインが失われます。

コードおよびカミソリビュー内で機能する唯一のものは

User.IsInRole("admin")

これはメニュー項目などには問題ありませんが、コントローラーのすべての単一アクション内に実装するのは非常に面倒です(そして、一度に1つのロールのみをテストするのは好きではありません)。

この問題を解決するためのガイダンスをいただければ幸いです。

53
Ahmed

答えを見つけました ここではMehdi Golchinによる が面倒をみているようです:

[Authorize(Roles="admin,editor,publisher")]

これをホームコントローラーにも追加する場合:

 [InitializeSimpleMembership]

この属性はアカウントコントローラー上にあるため、SimpleMembershipデータベースは、ログイン/登録などのアカウントコントローラーの最初の使用後にのみ初期化されます。現在のユーザーがCookieからログインしても、データベースは初期化されないため、エラーがスローされます。 1つの解決策は、Webサイトを起動したときに呼び出されるホームコントローラーにこの属性を配置することです。ただし、ロールをチェックし、ロールに基づいて異なるメニュー項目を表示するため、すべてのコントローラーに配置する必要があります。

データベースは、最初に使用するときではなく、App_Startで初期化する必要があるため、設計が不十分です。

入れようとしました

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

Global.asaxApplication_Start()で、User.IsInRole("admin")を使用してメニュー項目のロールチェックを処理しますが、追加の属性[InitializeSimpleMembership]が適用されている場合でも、[Authorize(Roles="admin")]属性を持つコントローラーでエラーをスローします。

そのため、現在のソリューションは、ユーザーが最初に外部リンクを使用して任意のページに移動できるように、すべてのコントローラーに `[InitializeSimpleMembership]を配置することです。

SimpleRolesProviderクラスを初期化して、単にUser.IsInRole()の代わりに、より多くのロール管理を行う方法を理解することはできません。

これらのことはwebmatrix webpagesサイトでうまく機能し、MVCのポートは完全ではありません。デフォルトのasp.netメンバーシッププロバイダーと競合して混乱します。

[〜#〜] edit [〜#〜]OKこの行をApp_Startの[InitializeSimpleMembership]に入れることでFilterConfig.csフィルターをグローバルに適用できるとは思っていませんでしたフォルダ:

filters.Add(new InitializeSimpleMembershipAttribute());

これで問題が解決します。 SimpleRolesProviderの初期化のためのソリューションが必要になります。そうでなければ、独自のロールプロバイダーを作成する必要があります。

UPDATE:

この Scott Allenによる投稿 は私のすべての問題を解決しました。

これを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;
69
Ahmed

WebアプリをVS2010/MVC3からVS2012/MVC4に移動したときに同じ問題が発生しました。

[InitializeSimpleMembership]を機能させることができませんでした。

これをweb.configに追加するとうまくいくことがわかりました。

  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>

そして、以前と同じようにすべてが正常に機能します。

6
keun