25

AccountController.csファイルで既に生成されているものを除いて、WebSecurityオブジェクトをどこでも機能させることはできません。アカウントコントローラー[InitializeSimpleMembership]の上部に属性が設定されています。WebSecurity.Login(...)たとえば、ログイン関数は呼び出しについて文句を言いません。AccountControllerに子アクションを追加しました。

[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、 "User"))」行でクラッシュし、件名にエラーメッセージが表示されます。そこで、InitialzeSimpleMembershipAttribute.csファイルに移動し、関数の先頭にこの行をコピーして貼り付けます。

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

...そして、WebSecurity.InitializeDatabaseConnectionは1回だけ呼び出す必要があるというエラーメッセージを受け取ります。これは理にかなっています。なぜなら、コントローラー定義の上部に、この関数を既に呼び出す必要のある属性があるからです(そして、それは問題なく行われているようです)。安全のために、上記の呼び出しを次のように変更します。

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

...そして、元のエラーメッセージを取得します。WebSecurity.InitializeDatabaseConnectionは、何とか何とか何とか前に呼び出す必要があります。この狂気への洞察は大歓迎です

4

5 に答える 5

49

ここにもっと良い説明があります:http: //odetocode.com/blogs/scott/archive/2012/09/24/perils-of-the-mvc4-accountcontroller.aspx

これがあなたがしなければならないすべてです:

  1. 上から削除[InitializeSimpleMembership]しますAccountController
  2. WebSecurity.InitializeDatabaseConnection(...)/Filters/InitializeSimpleMembershipAttribute.cs(39行目)から/AppStart/AuthConfig.csに呼び出しをコピーします
  3. プロジェクトからInitializeSimpleMembershipAttribute.csを自由に削除してください

に呼び出しを追加する必要はありません、それは論理的な場所のようであり、Global.asaxをよりクリーンに保ちます。InitializeDatabaseConnection()AuthConfig.RegisterAuth()

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

于 2013-04-07T15:31:00.613 に答える
9

[InitializeSimpleMembership](AccountControllerに記載されているように)をコントローラーの上部に追加すると、WebSecurityにアクセスする必要がありました。ただし、意図した実装方法かどうかはわかりません...

[InitializeSimpleMembership]
public class DataController : Controller
{ ... }
于 2013-01-29T16:36:05.990 に答える
5

私はこれをインターウェブで見つけました:http://forums.asp.net/t/1718361.aspx/1 基本的に、SimpleRoleProviderタイプを使用しないでください。次のような単純な呼び出しを可能にするRolesオブジェクトが利用可能です。

if (Request.IsAuthenticated)
{
  if( Roles.IsUserInRole(User.Identity.Name, "User"))
  {
    viewModel.LinkItems.Add(new NavBarLinkItem() 
    { Title = "Create Project", Action = "Create", Controller = "Campaign" });
  }
}
于 2012-10-29T19:44:04.470 に答える
1

まず、web.configでロールとメンバーシッププロバイダーを設定する必要があります。

<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の場合の解決策は同じです。

SimpleMembershipProvider msp = new SimpleMembershipProvider(Membership.Provider);
于 2013-10-13T18:01:35.627 に答える
1

私の場合、IIS認証設定内で匿名認証を無効にする必要がありました。

次に、フォームとWindows認証を有効にする必要がありました。もちろん、これはアプリに必要な認証によって異なります。

そうすると、エラーはなくなり、アプリは期待どおりに機能しました。

于 2015-05-29T09:08:32.637 に答える