asp.net-mvc - Asp.net MVC4、PostgreSQL 和 SimpleMembership

标签 asp.net-mvc entity-framework postgresql

我使用 Npgsql 2.1 和 EntityFramework 6.0 来处理 PostgreSQL(代码优先)。 一切正常。这是我的 Web.config 的一部分:

<configuration>
  <configSections>
//---
  <connectionStrings>  
    <add name="MovieDBContext" connectionString="Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=123;" 
         providerName="Npgsql" />    
  </connectionStrings>
//---
  <entityFramework>
    <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" />
    <providers>
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework"></provider>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Npgsql" />
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" 
type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
  </system.data>  
</configuration>

对于 10 个相关表来说一切正常。但现在我需要授权。

我当然读过这篇文章了 奥 git _a 其中 Francisco Junior 建议使用 Daniel Nauck 的 AspSQLProvider。

我从 NuGet 安装了 NauckIT.PostgreSQLProvider.2.0.0。 执行包中的脚本以为其创建一组表。 将这部分配置信息添加到Web.config中:

 <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />

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

    <machineKey validationKey="518A9D0E650ACE4CB22A35DA4563315098A96D0BB8E357531C7065D032099214A11D1CA074B6D66FF0836B35CEAAD0E7EEEFAED772754832E0A5F94EF8522222"
        decryptionKey="DB5660C109E9EC70F044BA1FED99DE0C5922321C5125E84C23A1B5CA0E426909"
        validation="SHA1" decryption="AES" />

    <membership defaultProvider="PgMembershipProvider">
      <providers>
        <clear/>
        <add name="PgMembershipProvider" type="NauckIT.PostgreSQLProvider.PgMembershipProvider" connectionStringName="MovieDBContext" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" passwordFormat="Hashed" applicationName="MvcMovie"/>
      </providers>
    </membership>

    <roleManager enabled="true" defaultProvider="PgRoleProvider" cacheRolesInCookie="true" cookieName=".AspNetRoles" cookiePath="/" cookieProtection="All" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="false" cookieTimeout="30" maxCachedResults="25">
      <providers>
        <clear/>
        <add name="PgRoleProvider" type="NauckIT.PostgreSQLProvider.PgRoleProvider" connectionStringName="MovieDBContext" applicationName="MvcMovie"/>
      </providers>
    </roleManager>

    <profile enabled="true" defaultProvider="PgProfileProvider">
      <providers>
        <clear/>
        <add name="PgProfileProvider" type="NauckIT.PostgreSQLProvider.PgProfileProvider" connectionStringName="MovieDBContext" applicationName="MvcMovie"/>
      </providers>
      <properties>
        <add name="FirstName"/>
        <add name="LastName"/>
      </properties>
    </profile>

    <sessionState    mode="Custom"    customProvider="PgSessionStateStoreProvider">
      <providers>
        <clear/>
        <add name="PgSessionStateStoreProvider" type="NauckIT.PostgreSQLProvider.PgSessionStateStoreProvider" enableExpiredSessionAutoDeletion="true" expiredSessionAutoDeletionInterval="60000" enableSessionExpireCallback="false" connectionStringName="MovieDBContext" applicationName="MvcMovie" />
      </providers>
    </sessionState>

尝试运行时出现错误:

Parser Error Message: This method cannot be called during the application's pre-start initialization phase.
Source Error: 
<providers>
<clear/>
<add name="PgMembershipProvider" type="NauckIT.PostgreSQLProvider.PgMembershipProvider" connectionStringName="MovieDBContext" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" passwordFormat="Hashed" applicationName="MvcMovie"/>
</providers>
</membership>

尝试查找有关此错误的任何信息。 遵循此建议 奥 git _a 我将其添加到 Web.config

  <appSettings>
//---
    <add key="enableSimpleMembership" value="false"/>
    <add key="autoFormsAuthentication" value="false"/>

现在应用程序可以运行,因为 SimpleMembership 已禁用。 顺便说一下,尝试注册用户时出现下一个错误

System.Reflection.TargetInvocationException was unhandled by user code
  HResult=-2146232828
  Message=Exception has been thrown by the target of an invocation.
  Source=mscorlib
  StackTrace:
       at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
       at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
       at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
       at System.Activator.CreateInstance(Type type, Boolean nonPublic)
       at System.Activator.CreateInstance(Type type)
       at System.Threading.LazyHelpers`1.ActivatorFactorySelector()
       at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory)
       at System.Threading.LazyInitializer.EnsureInitialized[T](T& target, Boolean& initialized, Object& syncLock)
       at MvcMovie.Filters.InitializeSimpleMembershipAttribute.OnActionExecuting(ActionExecutingContext filterContext) in d:\Projects\_Npg\MvcMovieSln\MvcMovie\Filters\InitializeSimpleMembershipAttribute.cs:line 22
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeActionMethodFilterAsynchronously(IActionFilter filter, ActionExecutingContext preContext, Func`1 nextInChain)
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<>c__DisplayClass3b.<BeginInvokeActionMethodWithFilters>b__35()
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeActionMethodFilterAsynchronously(IActionFilter filter, ActionExecutingContext preContext, Func`1 nextInChain)
  InnerException: System.InvalidOperationException
       HResult=-2146233079
       Message=The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588
       Source=MvcMovie
       StackTrace:
            at MvcMovie.Filters.InitializeSimpleMembershipAttribute.SimpleMembershipInitializer..ctor() in d:\Projects\_Npg\MvcMovieSln\MvcMovie\Filters\InitializeSimpleMembershipAttribute.cs:line 46
       InnerException: System.InvalidOperationException
            HResult=-2146233079
            Message=Failed to set Database.DefaultConnectionFactory to an instance of the 'Npgsql.NpgsqlFactory, Npgsql' type as specified in the application configuration. See inner exception for details.
            Source=EntityFramework
            StackTrace:
                 at System.Data.Entity.Internal.AppConfig.<.ctor>b__3()
                 at System.Lazy`1.CreateValue()
                 at System.Lazy`1.LazyInitValue()
                 at System.Lazy`1.get_Value()
                 at System.Data.Entity.Internal.AppConfig.TryGetDefaultConnectionFactory()
                 at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetServiceFactory(Type type, String name)
                 at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 t)
                 at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
                 at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetService(Type type, Object key)
                 at System.Data.Entity.Infrastructure.DependencyResolution.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
                 at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
                 at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
                 at System.Data.Entity.Infrastructure.DependencyResolution.ResolverChain.GetService(Type type, Object key)
                 at System.Data.Entity.Infrastructure.DependencyResolution.CompositeResolver`2.GetService(Type type, Object key)
                 at System.Data.Entity.Infrastructure.DependencyResolution.DbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver)
                 at System.Data.Entity.Internal.LazyInternalConnection.Initialize()
                 at System.Data.Entity.Internal.LazyInternalConnection.get_ProviderName()
                 at System.Data.Entity.Internal.LazyInternalContext.get_ProviderName()
                 at System.Data.Entity.Internal.DefaultModelCacheKeyFactory.Create(DbContext context)
                 at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
                 at System.Data.Entity.Internal.InternalContext.CreateObjectContextForDdlOps()
                 at System.Data.Entity.Database.Exists()
                 at MvcMovie.Filters.InitializeSimpleMembershipAttribute.SimpleMembershipInitializer..ctor() in d:\Projects\_Npg\MvcMovieSln\MvcMovie\Filters\InitializeSimpleMembershipAttribute.cs:line 35
            InnerException: System.MissingMethodException
                 HResult=-2146233069
                 Message=Constructor on type 'Npgsql.NpgsqlFactory' not found.
                 Source=mscorlib
                 StackTrace:
                      at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
                      at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
                      at System.Activator.CreateInstance(Type type, Object[] args)
                      at System.Data.Entity.Internal.AppConfig.<.ctor>b__3()
                 InnerException: 

LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);

在类里面

InitializeSimpleMembershipAttribute

请帮助配置 Daniel Nauck 的 AspSQLProvider 和 InitializeSimpleMembershipAttribute(如果需要)。

谢谢!

最佳答案

问题在于实现 AccountController 而不是默认值。

好的。解决办法在这里

我喜欢这个 PostgreSQL 的成员资格和角色提供程序 https://code.google.com/p/pgprovider/ 因为它在启动时会自行创建所有必需的表))

安装它:

安装包pgProvider

添加到 Web.config:

  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <connectionStrings>
    <add name="MovieDBContext" connectionString="Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=000;" providerName="Npgsql" />
    <add name="pgProvider" connectionString="Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=000;" providerName="Npgsql" />    
  </connectionStrings>

    <membership defaultProvider="pgMembershipProvider">
      <providers>
        <clear />
        <add name="pgMembershipProvider" type="pgProvider.pgMembershipProvider, pgProvider" applicationName="MvcMovie"/>
      </providers>
    </membership>
    <roleManager defaultProvider="pgRoleProvider">
      <providers>
        <clear />
        <add name="pgRoleProvider" type="pgProvider.pgRoleProvider, pgProvider" applicationName="MvcMovie"/>
      </providers>
    </roleManager>

然后也添加到 Web.config 中:

  <appSettings>
    //---
    <add key="enableSimpleMembership" value="false"/>
    <add key="autoFormsAuthentication" value="false"/>    
  </appSettings>

然后删除默认创建的AccountController。

最后添加 AccountController:

public class AccountController : Controller 
{
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;        
        return View();
    }

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }
    return View(model);
}

public ActionResult LogOff()
{
    FormsAuthentication.SignOut();

    return RedirectToAction("Login", "Account");
}

public ActionResult Register()
{
    return View();
}

[HttpPost]
public ActionResult Register(RegisterModel model)
{           
    if (ModelState.IsValid)
    {
        MembershipCreateStatus status;

        MembershipUser membershipUser = (Membership.Provider).CreateUser(
            model.UserName, model.Password, null,null,null, true, null, out status);

        if (membershipUser != null)
        {
            FormsAuthentication.SetAuthCookie(model.UserName, false);
            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError("", "Registration error");
        }
    }
    return View(model);
}

}

提供者的源代码在这里: https://code.google.com/p/pgprovider/source/browse/trunk/pgProvider/pgMembershipProvider.cs

仅此而已。

它适用于默认创建的登录和注册 View 。

关于asp.net-mvc - Asp.net MVC4、PostgreSQL 和 SimpleMembership,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550572/

相关文章:

c# - MVC 显示目录列表未加载应用程序

mysql - Linq to EF 不返回所有数据

postgresql - Postgres 生日选择

asp.net-mvc - 我的 ViewBag 无法工作有什么原因吗?

ASP.NET MVC - 压缩 + 缓存

c# - 在 UWP 中将 Entity Framework 与 SQL Server 结合使用

postgresql - 错误 : unterminated dollar-quoted string at or near "$BODY$

java - 使用@GeneratedValue 在@Id 上违反Hibernate 空约束

c# - 在业务层使用Server.MapPath

c# - 使用 Entity Framework 4.0 更新分离的实体实例