将表单身份验证(简单成员身份)添加到web api应用程序

时间:2013-01-19 12:09:33

标签: asp.net-mvc-4 asp.net-web-api simplemembership

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

无论如何,我错过了一些东西,因为一旦我尝试使用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(第二个条目是用302替换401):

<add key="enableSimpleMembership" value="true"/>
<add key="webapi:EnableSuppressRedirect" value="false" />

同时从原始模板中删除个人资料,成员资格和角色管理员部分(它们不适用于简单成员资格)。

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添加到Filters(代码非常标准,见下文)。

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);
            }
        }
    }
}