0

我正在尝试向 MVC4 webapi 项目添加在 MVC 4 web 应用程序项目中找到的简单成员身份提供程序身份验证机制,用于为其页面提供丰富 JS 内容的混合应用程序,该应用程序使用 AJAX 调用 webapi 操作来执行其任务. 我需要应用程序用户进行身份验证,然后他们才能使用这些页面中提供的应用程序,所以我认为我可以使用表单身份验证。因此,我需要将其添加到现有的 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(第 2 个条目用于将 401 替换为 302):

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

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

2) 为 OpenAuth 添加 NuGet 包(DotNetOpenAuth Core、DotNetOpenAuth ext for ASP.NET、DotNetOpenAuth 1.0(a) consumer、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);
            }
        }
    }
}
4

1 回答 1

0

这可能是相关的,因为它特别提到了您的错误: http ://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp- net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

于 2013-10-09T15:41:46.460 回答