53

VS2012RTMの外部ログイン用のOAuthへのリンクを備えたMVC4インターネットテンプレートの新しいsimplemembership機能が気に入っています。ほとんどの場合、認証機能が機能しています。ただし、これに8時間以上費やした後でも、コントローラーで動作するロールベースの承認を実装できません。SimpleMembershipは単純ではないことが判明しています。

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

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

[Authorize(Roles="admin")]

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

コードとかみそりのビュー内で機能するのは

User.IsInRole("admin")

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

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

4

2 に答える 2

69

世話をしているように見える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;
于 2012-09-04T16:12:11.727 に答える
6

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

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

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

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

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

于 2013-02-28T15:30:39.663 に答える