MVC4 webapi プロジェクトに、MVC 4 web アプリケーション プロジェクトにある単純なメンバーシップ プロバイダー認証メカニズムを追加しようとしています。これは、webapi アクションへの AJAX 呼び出しを使用してタスクを実行する、リッチ JS コンテンツを含むページを提供するハイブリッド アプリケーション用です。 . これらのページで提供されているアプリを操作するには、アプリ ユーザーが認証を受ける必要があるため、フォーム認証で問題ないと思います。したがって、それを既存の WebApi プロジェクトに追加し、承認済みのみのアクションが 401 ではなく 302 (ユーザーをログイン ページにリダイレクト) を返すようにする必要があります。
とにかく、WebSecurity メソッドを使用しようとするとすぐに次の例外が発生するため、何かが欠けています。
System.InvalidOperationException was caught
Message=To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider".
Source=WebMatrix.WebData
誰でも修正を提案できますか?承認を追加するために行った手順は次のとおりです。
1) Web.config: system.web に追加:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
appsettings に追加します (2 番目のエントリは 401 を 302 に置き換えるためのものです):
<add key="enableSimpleMembership" value="true"/>
<add key="webapi:EnableSuppressRedirect" value="false" />
また、元のテンプレートから profile、membership、および rolemanager セクションを削除します (単純なメンバーシップで使用するためのものではありません)。
2) OpenAuth 用の NuGet パッケージ (DotNetOpenAuth Core、ASP.NET 用の DotNetOpenAuth ext、DotNetOpenAuth 1.0(a) コンシューマ、DotNetOpenAuth 1.0(a)、DotNetOpenAuth OpenID Core、DotNetOpenAuth OpenID Relying Party) を追加します。
3) InitializeSimpleMembership.cs をフィルターに追加します (コードは非常に標準的です。以下を参照してください)。
4) MVC Web アプリ プロジェクトから、AccountModels.cs のモデル、Views/Account のすべてのビュー、および AccountController.cs をコピーします。
InitializeSimpleMembership コードは次のとおりです。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
private static SimpleMembershipInitializer _initializer;
private static object _initializerLock = new object();
private static bool _isInitialized;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
}
private class SimpleMembershipInitializer
{
private static void SeedData()
{
// seed data: users and roles
if (!WebSecurity.UserExists("TheAdminGuyName"))
WebSecurity.CreateUserAndAccount("TheAdminGuyName", "password");
if (!Roles.RoleExists("administrator")) Roles.CreateRole("administrator");
if (!Roles.IsUserInRole("TheAdminGuyName", "administrator"))
Roles.AddUserToRole("TheAdminGuyName", "administrator");
}
public SimpleMembershipInitializer()
{
Database.SetInitializer<UsersContext>(null);
try
{
using (var context = new UsersContext())
{
if (!context.Database.Exists())
{
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
}
}
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "User", "UserId", "UserName", autoCreateTables: true);
SeedData();
}
catch (Exception ex)
{
throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
}
}
}
}