2

私は気が狂いそうになるので、もう一度助けを求めようと思います... Visual Studio Express 2012 for Web を使用して、C# + MVC4 + Razor + Entity Framework + ASP.NET を使用してインターネット プロジェクトを作成しています。 4.5. 次のことを行う必要があります。「管理者」ユーザー (サイト全体で承認される) を自動的に作成し、いくつかのユーザー ロールを作成します。SimpleMembership、ロール、およびすべての Web 上のすべてについて読みましたが、すべてを機能させるための簡単な方法は何もないようです。

これは私がこれまでに行ったことです:

1- DataContext クラスを作成しました:

public class DataContext : DbContext
{
public DataContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}

2-管理者ユーザーと管理者ロールが作成されると想定する初期化クラスを作成しました。

public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
var roles = (Webmatrix.WebData.SimpleRoleProvider)System.Web.Security.Roles.Provider;
var membership = (Webmatrix.WebData.SimpleMembershipProvider)System.Web.Security.Membership.Provider;
if (!roles.RoleExists("Admins")) {
roles.CreateRole("Admins");
}
if (membership.GetUser("admin", false) == null) {
membership.CreateUserAndAccount("admin", "123456");
}
if (!roles.GetRolesForUser("admin").Contains("Admins")) {
roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
} 
}
}

(DropCreateDatabaseIfModelChanges から継承しようとしましたが、それは役に立ちません)。

3- Global.asax の App_Start メソッドに次の 2 行を追加しました。

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Database.SetInitializer<DataContext>(new DataContextDbInitializer());

また、DataContextDbInitializer クラスの Seed メソッドで WebSecurity.InitializeDatabaseConnection を使用しようとしましたが、機能しませんでした。

4- [InitializeSimpleMembership] 注釈を AccountController から削除したため、アプリケーション ライフ サイクルの最初から初期化できます (3 番目で説明したように、App_Start で WebSecurity.InitializeDatabaseConnection を使用します)。HomeController の Index メソッドの上に [InitializeSimpleMembership] を追加し、App_Start から WebSecurity.InitializeDatabaseConnection を削除しようとしましたが、どちらも役に立ちません。

5- Web.config では、フォーム (既定) として認証方法を使用し、既定の接続文字列も残しました。

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-TPFinal-20130121210447;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-TPFinal-20130121210447.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>

そして、これを system.web タグ内に追加しました:

<roleManager enabled="true" cacheRolesInCookie="true" />

6-次に、すべてが機能するかどうかをテストするために、HomeController の About() メソッドの上に [Authorize(Roles = "Admins")] アノテーションを使用します。期待どおりに動作していた場合、HomeController/About によって制御される「About」ページを表示できるようにするには、admin/123456 としてログインする必要があります。

7- EF の移行などは追加していません。VS2012が自動的に作成したため、他のすべてのものはデフォルトです。そこで、アプリケーションを実行して [About] リンクをクリックすると、ログイン フォームが表示されます (つまり、[Authorize(Roles = "Admins")] アノテーションが期待どおりに機能していることを意味します)。admin/123456 としてログインしようとしましたが、ログイン ボタンをクリックするたびに、ログイン ページが何度もリロードされます。

私が気づいたいくつかのこと:

-シード メソッドにブレークポイントを追加すると、呼び出されないようです。

-DropCreateDatabaseAlways を使用してアプリケーションを再度実行すると、admin/123456 としてログインできます。DB を最初から作成する必要があると想定しているため、DataContextDbInitializer クラス全体が使用されていないことをもう一度考えさせられます。これにより、管理者ユーザーが削除されます。

他に何を読むべきか、他に何を試すべきかわかりません...私はasp.netを初めて使用し(それを言う必要がありますか?)、ただ夢中になっています。ありがとう!!

4

3 に答える 3

1

最後に、私はすべてを機能させることができました!

私のシードメソッドは次のようになります。

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

if (!Roles.RoleExists("Admins"))
{
    Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
    WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
    Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
base.Seed(context);

Global.asax の私の App_Start は次のようになります。

Database.SetInitializer(new DataContextDbInitializer());
DataContext c = new DataContext();
c.Database.Initialize(true);

これが実際に何かを行っているかどうかはわかりませんが、Web.config の system.web タグ内にこれがあります。

<roleManager enabled="true" cacheRolesInCookie="true" />

また、AccountController から [InitializeSimpleMembership] を削除し、AccountModels の UsersContext クラスも削除しました。このビットを独自のコンテキスト クラスに移動しました。

public DbSet<UserProfile> UserProfiles { get; set; }

次に、すべてが機能するかどうかをテストするために、HomeController の About() メソッドの上に [Authorize(Roles = "Admins")] アノテーションを使用します。期待どおりに動作している場合は、HomeController/About によって制御される「About」ページを表示できるようにするために、admin/123456 としてログインする必要があります。どちらですか ;)

助けてくれてありがとう!何が起こっているのかをもう少し理解するのに役立ちました。

于 2013-01-28T11:05:47.537 に答える
0

このようにしてみてください:

public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
    protected override void Seed(DataContext context)
    {
        if (!Roles.RoleExists("Admins"))
        {
            Roles.CreateRole("Admins");
        }
        if (!WebSecurity.UserExists("admin"))
        {
            WebSecurity.CreateUserAndAccount("admin", "123456");
        }
        if (!Roles.GetRolesForUser("admin").Contains("Admins"))
        {
            Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
        }
    }
}

そしてあなたのApplication_Start

Database.SetInitializer<DataContext>(new DataContextDbInitializer());
using (var ctx = new DataContext())
{
    ctx.Database.Initialize(true);
}
WebSecurity.InitializeDatabaseConnection(
    "DefaultConnection", 
    "UserProfile", 
    "UserId", 
    "UserName", 
    autoCreateTables: true
);
于 2013-01-27T14:26:51.803 に答える