添加membership用户到DNN数据库
在我的 <<DotNetNuke与MemberShip的结合(五年版)>>中提出将DNN的身份认证指出现在的membership数据库.而且,admin,host用户可以正常登录.但我们用membership数据库中现在有的用户登录,就会发现不能成功登录.
看相关源码:Provider.Membership.AspNetProvider(AspNetMembershipProvider.vb)
Public Overrides Function UserLogin(ByVal portalId As Integer, ByVal username As String, ByVal password As String, ByVal verificationCode As String, ByRef loginStatus As UserLoginStatus) As UserInfo
'For now, we are going to ignore the possibility that the User may exist in the
'Global Data Store but not in the Local DataStore ie. A shared Global Data Store
'Initialise Login Status to Failure
loginStatus = UserLoginStatus.LOGIN_FAILURE
'Get a light-weight (unhydrated) DNN User from the Database, we will hydrate it later if neccessary
Dim user As UserInfo = Nothing
user = GetUserByUserName(portalId, username, False)
If Not user Is Nothing Then
'Get AspNet MembershipUser
Dim aspnetUser As AspNetSecurity.MembershipUser = Nothing
aspnetUser = GetMembershipUser(user)
'Fill Membership Property from AspNet MembershipUser
FillUserMembership(aspnetUser, user)
'Check if the User is Locked Out (and unlock if AutoUnlock has expired)
If aspnetUser.IsLockedOut Then
Dim intTimeout As Integer = Null.NullInteger
If Not HostSettings("AutoAccountUnlockDuration") Is Nothing Then
Dim strTimeout As String = Convert.ToString(HostSettings("AutoAccountUnlockDuration"))
If Not String.IsNullOrEmpty(strTimeout) Then
intTimeout = Convert.ToInt32(strTimeout)
End If
End If
If intTimeout <> 0 Then
If intTimeout = Null.NullInteger Then
intTimeout = 10
End If
If aspnetUser.LastLockoutDate < Date.Now.AddMinutes(-1 * intTimeout) Then
'Unlock User
user.Membership.LockedOut = False
'Persist to Data Store
aspnetUser.UnlockUser()
Else
loginStatus = UserLoginStatus.LOGIN_USERLOCKEDOUT
End If
End If
End If
'Check in a verified situation whether the user is Approved
If user.Membership.Approved = False And user.IsSuperUser = False Then
'Check Verification code
If verificationCode = (portalId.ToString & "-" & user.UserID) Then
'Approve User
user.Membership.Approved = True
'Persist to Data Store
UpdateUser(user)
Else
loginStatus = UserLoginStatus.LOGIN_USERNOTAPPROVED
End If
End If
'Verify User Credentials
Dim bValid As Boolean = False
If loginStatus <> UserLoginStatus.LOGIN_USERLOCKEDOUT And loginStatus <> UserLoginStatus.LOGIN_USERNOTAPPROVED Then
If user.IsSuperUser Then
If ValidateUser(Null.NullInteger, username, password) Then
loginStatus = UserLoginStatus.LOGIN_SUPERUSER
bValid = True
End If
Else
If ValidateUser(portalId, username, password) Then
loginStatus = UserLoginStatus.LOGIN_SUCCESS
bValid = True
End If
End If
End If
If Not bValid Then
'Clear the user object
user = Nothing
End If
End If
Return user
End Function
其中有三句关键
Dim user As UserInfo = Nothing
user = GetUserByUserName(portalId, username, False)
If Not user Is Nothing Then
意思就是,要先读取DNN用户数据表中的用户即dnn_Users中的用户.而以<<DotNetNuke与MemberShip的结合(五年版)>>办法安装的DNN数据库,在membership中原有的用户,在dnn_Users中却并不存在相应的用户,所以出现用membership中原有的用户无法登录DNN.
我作了下面修正,让登录DNN的用户如果只存在于membership中而不存在于dnn_Users中的数据自动添加.
改到处关键原码
Public Overrides Function UserLogin(ByVal portalId As Integer, ByVal username As String, ByVal password As String, ByVal verificationCode As String, ByRef loginStatus As UserLoginStatus) As UserInfo
'For now, we are going to ignore the possibility that the User may exist in the
'Global Data Store but not in the Local DataStore ie. A shared Global Data Store
'Initialise Login Status to Failure
loginStatus = UserLoginStatus.LOGIN_FAILURE
'Get AspNet MembershipUser
Dim aspnetUser As AspNetSecurity.MembershipUser = Nothing
aspnetUser = GetMembershipUser(username)
If aspnetUser Is Nothing Then
Return Nothing
End If
'Get a light-weight (unhydrated) DNN User from the Database, we will hydrate it later if neccessary
Dim user As UserInfo = Nothing
user = GetUserByUserName(portalId, username, False)
If (user Is Nothing) Then
按照一个AspNetMembershipProvider新建一个项目
Public Class AspNetMembershipProviderFiveYears
Inherits DotNetNuke.Security.Membership.MembershipProvider
改web.config增加一个AspNetMembershipProvider,并设置为defaultProvider
<members defaultProvider="AspNetMembershipProviderFiveYears">
<providers>
<clear />
<add name="AspNetMembershipProvider" type="DotNetNuke.Security.Membership.AspNetMembershipProvider, DotNetNuke.Provider.AspNetProvider" providerPath="~\Providers\MembershipProviders\AspNetMembershipProvider\" />
<add name="AspNetMembershipProviderFiveYears" type="DotNetNuke.Security.Membership.AspNetMembershipProviderFiveYears, DotNetNuke.Provider.AspNetProviderFiveYears" providerPath="~\Providers\MembershipProviders\AspNetMembershipProviderFiveYears\" />
</providers>
</members>
相关文章: <<DotNetNuke与MemberShip的结合(五年版)>>
http://www.cnblogs.com/shiningrise/archive/2007/08/13/854297.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章