2013-01-19 32 views
0

我想添加到MVC4的WebAPI項目在MVC 4 Web應用程序項目中的簡單成員資格提供身份驗證機制,發揮其具有豐富的JS網頁內容的混合應用程序,它使用AJAX調用webapi操作來執行其任務。我需要應用程序用戶在使用這些頁面中提供的應用程序之前進行身份驗證,因此我認爲我會很好地使用表單身份驗證。因此,我需要將其添加到現有的WebApi項目中,並讓我的授權操作返回302(重定向用戶登錄頁面)而不是401。使用WebSecurity方法,我得到以下異常:添加窗體身份驗證(SimpleMembership)到的WebAPI應用

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項是與302)替換401:

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

也由原來的模板中刪除個人資料,會員和rolemanager段(他們不打算用簡單的會員使用)。 (DotNetOpenAuth Core,DotNetOpenAuth ext for ASP.NET,Do​​tNetOpenAuth 1.0(a)消費者,DotNetOpenAuth 1.0(a),DotNetOpenAuth OpenID核心,DotNetOpenAuth OpenID依賴方)的NuGet包。

3)添加到InitializeSimpleMembership.cs過濾器(代碼是非常標準的,見下文)。

4)從一個MVC的Web應用程序項目複製AccountModels.cs的車型,在查看/帳戶各方面的意見和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); 
      } 
     } 
    } 
} 

回答