Asp.net mvc 4 向webapi应用程序添加表单身份验证(SimpleMembership)

Asp.net mvc 4 向webapi应用程序添加表单身份验证(SimpleMembership),asp.net-mvc-4,asp.net-web-api,simplemembership,Asp.net Mvc 4,Asp.net Web Api,Simplemembership,我试图在MVC4 webapi项目中添加MVC4 web应用程序项目中的简单成员身份提供程序身份验证机制,用于混合应用程序,该应用程序使用丰富的JS内容为其页面提供服务,它使用对webapi操作的AJAX调用来执行其任务。我需要应用程序用户在使用这些页面中提供的应用程序之前进行身份验证,因此我认为我可以使用表单身份验证。因此,我需要将其添加到现有的WebApi项目中,并让我的仅授权操作返回302(将用户重定向到登录页面)而不是401 无论如何,我遗漏了一些东西,因为只要我尝试使用WebSecur

我试图在MVC4 webapi项目中添加MVC4 web应用程序项目中的简单成员身份提供程序身份验证机制,用于混合应用程序,该应用程序使用丰富的JS内容为其页面提供服务,它使用对webapi操作的AJAX调用来执行其任务。我需要应用程序用户在使用这些页面中提供的应用程序之前进行身份验证,因此我认为我可以使用表单身份验证。因此,我需要将其添加到现有的WebApi项目中,并让我的仅授权操作返回302(将用户重定向到登录页面)而不是401

无论如何,我遗漏了一些东西,因为只要我尝试使用WebSecurity方法,就会出现以下异常:

捕获到System.InvalidOperationException Message=若要调用此方法,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例。 Source=WebMatrix.WebData

有人能提出解决办法吗?以下是我为添加授权而采取的步骤:

1) Web.config:添加到system.Web:

<authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

添加到appsettings(第二个条目用于将401替换为302):


同时从原始模板中删除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依赖方)

3) 将InitializeSimpleMembership.cs添加到过滤器(代码相当标准,请参见下文)

4) 从MVC web应用程序项目复制AccountModels.cs中的模型、views/Account中的所有视图和AccountController.cs

InitializeSampleMembership代码如下:

[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);
            }
        }
    }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple=false,Inherited=true)]
公共密封类InitializeSimpleMembershipAttribute:ActionFilterAttribute
{
私有静态SimpleMembershipInitializer\u initializer;
私有静态对象_initializerLock=新对象();
私有静态布尔值初始化;
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
LazyInitializer.确保重新初始化(参考初始值设定项,参考初始值设定项,参考初始值设定项锁定);
}
私有类SimpleMembershipInitializer
{
私有静态void SeedData()
{
//种子数据:用户和角色
如果(!WebSecurity.UserExists(“TheAdminGuyName”))
CreateUserAndAccount(“管理员名称”、“密码”);
如果(!Roles.RoleExists(“管理员”))Roles.CreateRole(“管理员”);
如果(!Roles.IsUserInRole(“管理员名称”、“管理员”))
Roles.AddUserToRole(“管理员名”、“管理员”);
}
公共SimpleMembershipInitializer()
{
Database.SetInitializer(null);
尝试
{
使用(var context=new UsersContext())
{
如果(!context.Database.Exists())
{
((IObjectContextAdapter)context.ObjectContext.CreateDatabase();
}
}
WebSecurity.InitializeDatabaseConnection(“DefaultConnection”、“User”、“UserId”、“UserName”,autoCreateTables:true);
种子数据();
}
捕获(例外情况除外)
{
抛出新的InvalidOperationException(“无法初始化ASP.NET简单成员身份数据库。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=256588“,ex);
}
}
}
}

这可能与此相关,因为它特别提到了您的错误:

链接上说了什么?单独链接的答案通常不好。
<add key="enableSimpleMembership" value="true"/>
<add key="webapi:EnableSuppressRedirect" value="false" />
[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);
            }
        }
    }
}