在数据库中创建用于Google身份验证的DNN用户

时间:2015-03-29 10:55:19

标签: dotnetnuke google-apps google-authentication

我尝试使用我与用户及其应该成为的成员的XML文件中的用户和角色来种植DNN数据库。当用户使用Google身份验证提供程序登录时,如何以DNN将获取现有用户帐户和关联角色的方式为数据库设定种子?

我们正在使用Google Apps进行身份验证,并且当您手动将帐户验证设置为DNN管理器并手动分配角色时,该功能可用。

我尝试输入用户,UserRoles,UserPortals和aspnet_Membership,aspnet_Users。但这并不奏效。当我尝试登录时,我收到一条消息,表明该用户帐户已在使用中。

修改问题似乎是我无法填充AuthenticationToken表格中的UserAuthentication列。我不知道如何构造插入此列的值。

DNN的Google身份验证提供程序本身也是开源的,所以我可以看看它是如何工作的吗?我还没有能够找到代码,但也许我没有长时间/足够好的搜索:)

2 个答案:

答案 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

我在我的计算机上测试了上面的脚本并且它有效。如果您有任何问题,请与我们联系。