【问题标题】:Creating DNN users in the database for Google Authentication在数据库中为 Google 身份验证创建 DNN 用户
【发布时间】:2015-03-29 10:55:18
【问题描述】:

我正在尝试从我拥有的 XML 文件中的用户和角色为 DNN 数据库播种,其中包含用户和他们应该属于的角色。当用户使用 Google 身份验证提供程序登录时,如何以 DNN 将获取现有用户帐户和关联角色的方式为数据库播种?

我们正在使用 Google Apps 进行身份验证,当您以 DNN 管理员身份手动进行帐户验证并手动分配角色时,这将起作用。

我尝试输入用户、UserRoles、UserPortals 和 aspnet_Membership、aspnet_Users。但这不起作用。当我尝试登录时,我收到一条消息,指出用户帐户已在使用中。

编辑问题似乎是我无法填写UserAuthentication 表中的AuthenticationToken 列。我不知道插入此列的值是如何构造的。

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

【问题讨论】:

  • 您是否尝试在这些表(Users、UserRoles、UserPortals 和 aspnet_Membership、aspnet_Users)上手动插入用户?或者你有特定的脚本来从 XML 文件中的这些表中插入用户??
  • 我有一个执行插入/更新的 C# 程序。问题好像是不能在UserAuthentication里面添加信息,因为不知道AuthenticationToken栏应该怎么填。
  • 好的...还有一个问题...您自己实现的 Google 身份验证提供程序扩展,或者它已经存在于 DNN 商店或其他地方?
  • 我正在使用 DNN 附带的那个(或者可能是他们提供的)

标签: dotnetnuke google-apps google-authentication


【解决方案1】:

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.

【讨论】:

  • 谢谢,看来我需要创建自己的提供程序。我不能接受答案是正确的,因为“答案”在付费墙后面。
【解决方案2】:

我做了一些研究,合并所有参考代码和developed a working script for you

您仍然需要根据您的要求对我的脚本进行一些修改。我的脚本是为在 DNN 网站中以编程方式添加用户而开发的。我认为您需要执行 foreach 循环以从 XML 文件中插入所有 Google 用户。您可以在foreach 循环中调用Dim status As UserCreateStatus = CreateUser(Me.PortalId) 行。

第 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

我在我的电脑上测试了上面的脚本,它可以工作。如果您有任何问题,请告诉我。

【讨论】:

猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 2020-01-05
  • 2019-02-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多