SimpleMembershipProvider 的 MySql 实现  _MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2086 | 回复: 0   主题: SimpleMembershipProvider 的 MySql 实现          下一篇 
liandong
注册用户
等级:新兵
经验:51
发帖:61
精华:0
注册:2011-11-14
状态:离线
发送短消息息给liandong 加好友    发送短消息息给liandong 发消息
发表于: IP:您无权察看 2014-11-19 10:00:59 | [全部帖] [楼主帖] 楼主

前几天想想,要不要玩玩 MySql 吧,看看是什么样子的。于是动手把手头上的一个小程序的数据库移植到 MySql 上,正好把开发环境从 VS2010 升级到 VS2012。还有 MVC2 升级到 MVC4 看看是有什么变化没。程序有认证的部分,就先从认证数据部分试开始了。

认证我一直用的是微软的 Membership 体系,看 MySql 也实现了对应的 Provider,在新建立了一个 MVC4 项目后,把 Provider 一改就直接启动,然后就出错了。异常是“To call this method, the “Membership.Provider”property must be an instance of “ExtendedMembershipProvider”.

其原因是微软引进了一个叫 SimpleMembershipProvider 的东西。这个东西确实在数据库端做了大量的简化,根本没用到任何存储过程,表的数量也减少了很多,并且提供了与其它网站进行登录的功能。在缺省情况下,WebMatrix.WebData.WebSecurity 利用 PreApplicationStart 这个技术,在程序启动时将全局变量 Membership 中的"AspNetSqlMembershipProvider"与 Roles 中的"AspNetSqlRoleProvider"这两个 Provider 分别替换为 SimpleMembershipProvider 与 SimpleRoleProvider,于是在什么也没有改变的表面下,传统的 Membeship 体系就被 SimpleMembership 给代替了。从这个替换的动作就可以发现,微软写的 SimpleMembership 根本就是为自家的 SqlServer 服务的,如果你用 IlSpy 去看 SimpleMembershipProvider 的代码的话,就会看到 SqlServer 的 T-Sql 语法直接写在了代码中,直接使用这个 SimpleMembership 去连接 MySql 的话,是会出错的。

而如果你直接用 MySql 的 Provider 的话,在 WebSecurity 中又会检查这个 Provider 是不是继承至微软新加入的 ExtendedMembershipProvider,当然,第三方怎么会跟的上微软这么自私的举动,于是上面那个异常就出现了。

在各种网站的问答栏中,有人推荐把这个 <add key="enableSimpleMembership" value="false"/> 放在 Web.config 的 <appSettings> 中,其实这个只是阻止了上面 WebSecurity 将系统的 maching.config 中配置的缺省 AspNetSql 系列的 Provider 用它的 Simple 系统的 Provider 来代替而已,如果你用的是自定义的 Membership,那么这个 enableSimpleMembership 的设置是无用的。所以解决方法要么是不要使用微软给你的那个套登录验证机制,要么自己写一个 Provider 来实现。

下面来说正经的吧。在 WebSecurity 中如果使用的是 SimpleMembershipProvider 那么会自动调用建表语句在数据库中建立要使用的表结构。如果不是 SimpleMembershipProvider 的话,则没有这个动作,所以建表要自己手动完成,或者在自定义的 Provider 中找合适的地方实现。在此,我直接用手动建立了表结构。

Create Table UserProfile (UserId int not null primary key auto_increment, UserName varchar(256) not null);
Create Table webpages_Membership (UserId int not null primary key, CreateDate datetime NULL, ConfirmationToken varchar(128) NULL,
IsConfirmed bit NULL, LastPasswordFailureDate datetime NULL, PasswordFailuresSinceLastSuccess int NOT NULL,
Password varchar(128) NOT NULL, PasswordChangedDate datetime NULL, PasswordSalt varchar(128) NOT NULL,
PasswordVerificationToken varchar(128) NULL, PasswordVerificationTokenExpirationDate datetime NULL);
Create Table webpages_OAuthMembership (Provider varchar(30) not null, ProviderUserId varchar(100) not null, UserId int not null);
Alter Table webpages_OAuthMembership Add Primary Key (Provider, ProviderUserId);
Create Table webpages_OAuthToken (Token varchar(100) not null primary key, Secret varchar(100) not null);
Create Table webpages_Roles (RoleId int not null primary key auto_increment, RoleName varchar(256) not null);
Create Table webpages_UsersInRoles (UserId int not null, RoleId int not null);
Alter Table webpages_UsersInRoles Add Primary Key (UserId, RoleId);


在 SimpleMembershipProvider 中,微软写进了大量的 Sql 代码,个人不喜欢这么做,于是就使用 LinqToEF 来实现数据端的操作。映射 EF 这个事情,你们比我懂,我就不说了。下面直接贴 MembershipProvider 的代码吧。在代码中,我的映射的 EF 叫 MembersAuthorContext。 

 {/if}


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论