我正在尝试向 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);
}
}
}
}