2012-10-29 24 views
23

WebSecurityオブジェクトは、AccountController.csファイルで既に生成されているもの以外の場所では動作させることができません。アカウントコントローラの上部には[InitializeSimpleMembership]属性が設定されています。ログイン機能は、例えばWebSecurity.Login(...)を呼び出すことについて不平を言うことはありません。 IはAccountControllerの子アクションを追加:"WebSecurity"クラスの他のメソッドを呼び出す前に "WebSecurity.InitializeDatabaseConnection"メソッドを呼び出す必要があります

[ChildActionOnly] 
     [AllowAnonymous] 
     public ActionResult NavBar() 
     { 
      NavBarViewModel viewModel = new NavBarViewModel(); 
      viewModel.LinkItems = new List<NavBarLinkItem>(); 

      if (Request.IsAuthenticated) 
      { 
       SimpleRoleProvider roleProvider = new SimpleRoleProvider(); 
       if (roleProvider.IsUserInRole(User.Identity.Name, "User")) 
       { 
        viewModel.LinkItems.Add(new NavBarLinkItem() 
        { Title = "Create Project", Action = "Create", Controller = "Project" }); 

       } 

      } 

      viewModel.LinkItems.Add(new NavBarLinkItem() { Title="Help", Action="Index", Controller="Help" }); 

      return PartialView("_NavBar", viewModel); 
     } 

左そのまま、 "IF(roleProvider.IsUserInRole(User.Identity.Name、 "ユーザー"))" は、対象のエラーメッセージをライン上のコードがクラッシュ。だから私はInitialzeSimpleMembershipAttribute.csファイルに移動して/私の関数の先頭に次の行をコピー&ペースト:

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

...とWebSecurity.InitializeDatabaseConnectionは一度だけ呼ばれるべきエラーメッセージが表示されます。コントローラー定義の先頭にこの関数を既に呼び出すべき属性があるので(これはうまくいくようです)、これは意味があります。だから、安全のために、私はへの呼び出し上記の変更:

if (!WebSecurity.Initialized) 
      { 
       WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", 
                 "UserName", autoCreateTables: true); 
      } 

...とWebSecurity.InitializeDatabaseConnectionは何とか何とか何とか前に呼び出されるべきであることを、元のエラーメッセージを、取り戻します。この狂気への洞察は大いに評価されるでしょう。

答えて

5

私はこれをinterwebsで見つけました:http://forums.asp.net/t/1718361.aspx/1 基本的にSimpleRoleProviderタイプは使用しないでください。 (上述とAccountControllerに見られるような)コントローラの上部に[InitializeSimpleMembership]私はトリックをしたからWebSecurity社にアクセスするために必要な追加

+1

これは本当に必要なほど明確ではありません。私はリンクを見ましたが、私は役割を作成しようとしていないので、私がやっていることとは関係ありません(私は思いますか?)。 私は同じ問題を抱えていますが、「これを2回呼び出すことはできません」というメッセージが表示されますが、「2番目」のメッセージを取ると「電話する必要があります...」というメッセージが表示されます。 「あなたが呼び出す必要があります...」というメッセージでクラッシュするのは、 if(OAuthWebSecurity.Login(result.Provider、result.ProviderUserId、createPersistentCookie:false)) アイデア? –

9
if (Request.IsAuthenticated) 
{ 
    if(Roles.IsUserInRole(User.Identity.Name, "User")) 
    { 
    viewModel.LinkItems.Add(new NavBarLinkItem() 
    { Title = "Create Project", Action = "Create", Controller = "Campaign" }); 
    } 
} 

:役割は、単純な、このような通話を可能にする使用可能なオブジェクトがあります私。しかし、その意図された実装方法けれども...

[InitializeSimpleMembership] 
public class DataController : Controller 
{ ... } 
48

場合は、ここでより良い説明がありますわからない: http://odetocode.com/blogs/scott/archive/2012/09/24/perils-of-the-mvc4-accountcontroller.aspx

ここだ、あなたがしなければならない:

  1. 上から[InitializeSimpleMembership]を削除しますAccountController
  2. /Filters/InitializeSimpleMembershipAttribute.cs(行39)からの電話をWebSecurity.InitializeDatabaseConnection(...)コールから/ AppStart/Aにコピーします。 uthConfig.cs
  3. はあなたがAuthConfig.RegisterAuth()InitializeDatabaseConnection()呼び出しを追加するを持っていないが、それは論理的な場所のように思えるし、あなたのGlobal.asaxのクリーナーを維持し、プロジェクト

からInitializeSimpleMembershipAttribute.csを削除気軽に。

基本的には、元の属性から初期化呼び出しを抽出し、Application_Startで明示的に呼び出します。あなたがSimpleMembershipを使用していない(または必要としない)場合に備えて、属性内の他のすべてが条件付きの検査になります。

+0

私は '[InitializeSimpleMembership]'属性をコントローラの上部に置くことができました。 – jwatts1980

+0

大きな説明兄弟。 –

+0

これを行うことの効果は何ですか?私はそれが理由のようなものであると想像します。 – Coops

1

まず、あなたのロールとメンバーシップ・プロバイダをWebで設定する必要があります。設定:

<authentication mode="Forms"> 
    <forms loginUrl="/Account/Login" slidingExpiration="true" timeout="60" /> 
</authentication> 
<membership defaultProvider="p1"> 
    <providers> 
    <add name="p1" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/> 
    </providers> 
</membership> 
<roleManager enabled="true" defaultProvider="p1"> 
    <providers> 
    <add name="p1" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> 
    </providers> 
</roleManager> 

あなたは、SimpleRoleProviderの新しいインスタンスを作成し、null以外のコンストラクタを使用し、引数としてweb.configファイルに設定されているデフォルトRoleProviderを供給:

SimpleRoleProvider srp = new SimpleRoleProvider(Roles.Provider); 

ソリューションです私は無効匿名認証ウィットに持っていた私の場合は

SimpleMembershipProvider msp = new SimpleMembershipProvider(Membership.Provider); 
1

:SimpleMembershipProviderの場合と同じIIS認証の設定を行います。

その後、フォームとWindows認証を有効にする必要がありました。 もちろん、これはあなたのアプリケーションに必要な認証に依存します。

私がやったことは、エラーが消えて、アプリケーションが期待通りに機能したことです。

関連する問題