我尝试使用我与用户及其应该成为的成员的XML文件中的用户和角色来种植DNN数据库。当用户使用Google身份验证提供程序登录时,如何以DNN将获取现有用户帐户和关联角色的方式为数据库设定种子?
我们正在使用Google Apps进行身份验证,并且当您手动将帐户验证设置为DNN管理器并手动分配角色时,该功能可用。
我尝试输入用户,UserRoles,UserPortals和aspnet_Membership,aspnet_Users。但这并不奏效。当我尝试登录时,我收到一条消息,表明该用户帐户已在使用中。
修改问题似乎是我无法填充AuthenticationToken
表格中的UserAuthentication
列。我不知道如何构造插入此列的值。
DNN的Google身份验证提供程序本身也是开源的,所以我可以看看它是如何工作的吗?我还没有能够找到代码,但也许我没有长时间/足够好的搜索:)
答案 0 :(得分:0)
Here is some documentation from DNN关于如何启用某些oAuth提供程序实现,包括我认为是您正在使用的Google提供程序。
请注意"在网站设置中配置注册选项"它解释了注册选项。所有身份验证提供程序应在首次成功身份验证时自动创建DNN用户帐户。这意味着您不应该事先为用户播种数据库。看起来在DNN 7.4中,根据“站点设置注册”类型对帐户的创建方式进行了更改。
如果您没有这样做,或者您需要以非常具体的方式更新来自源(Google)的用户信息,则可能需要自定义您自己的身份验证提供程序。 I have a tutorial that explains the basics of this on DNNHero.com
答案 1 :(得分:0)
我有一些研究,合并所有参考代码和developed a working script for you。
您必须在我的脚本中根据您的要求进行一些修改。我的脚本是为在DNN网站中以编程方式添加用户而开发的。我认为您需要执行foreach
循环才能从XML文件中插入所有Google用户。您可以在Dim status As UserCreateStatus = CreateUser(Me.PortalId)
循环中调用foreach
行。
第1步:在您的DNN网站中创建角色“ Google用户”。
第2步:在班级中创建MembershipProvider
的成员变量。
Private Shared memberProvider As DotNetNuke.Security.Membership.MembershipProvider = DotNetNuke.Security.Membership.MembershipProvider.Instance()
第3步:使用以下方法设置XML用户数据。
Private Shared Function GetUserInfo(ByVal fiPortalId As Integer) As UserInfo
Dim a As New UserInfo
a.FirstName = FirstName
a.LastName = LastName
a.PortalID = fiPortalId
a.Email = EMail
a.Username = UserName
a.DisplayName = DisplayName
Dim objMembership As UserMembership = New UserMembership
objMembership.Approved = True
objMembership.CreatedDate = DateTime.Now
objMembership.Email = EMail
objMembership.Username = UserName
objMembership.Password = Password
a.Membership = objMembership
a.IsSuperUser = False
Return a
End Function
第4步:创建用户方法。
Public Shared Function CreateUser(ByVal fiPortalId As Integer) As UserCreateStatus
Dim createStatus As UserCreateStatus = UserCreateStatus.AddUser
Dim user As UserInfo = GetUserInfo(fiPortalId)
'Create the User
createStatus = memberProvider.CreateUser(user)
If createStatus = UserCreateStatus.Success Then
'Dim objEventLog As New Services.Log.EventLog.EventLogController
'objEventLog.AddLog(objUser, PortalController.GetCurrentPortalSettings, UserController.GetCurrentUserInfo.UserID, "", Services.Log.EventLog.EventLogController.EventLogType.USER_CREATED)
DataCache.ClearPortalCache(user.PortalID, False)
addRoleToUser(user, "Google User", DateTime.Now.AddYears(25))
End If
Return createStatus
End Function
第5步:将角色应用于所有用户。
Public Shared Function addRoleToUser(ByRef user As UserInfo, ByVal roleName As String, ByRef expiry As DateTime) As Boolean
Dim rc As Boolean = False
Dim roleCtl As RoleController = New RoleController
Dim newRole As RoleInfo = roleCtl.GetRoleByName(user.PortalID, roleName)
If newRole IsNot Nothing And user IsNot Nothing Then
roleCtl.AddUserRole(user.PortalID, user.UserID, newRole.RoleID, DateTime.MinValue, expiry)
user = UserController.GetUserById(user.PortalID, user.UserID)
rc = user.IsInRole(roleName)
End If
Return rc
End Function
我在我的计算机上测试了上面的脚本并且它有效。如果您有任何问题,请与我们联系。