DotnetNuke Changes to Promote User to SuperUser

I implemented mixed Authentication for DotNetNuke ( Use Windows Integrated Authentication for seamless logon intranet logon and use Forms authentication for users unable to use Windows Integrated authentication), similar to as I did it before for my ASP.NET application . See my previous post about some problems that I had.

It is also required to promote imported from Active Directory Administrator user to SuperUser. The current DNN core doesn't support this.It only allows to create a new SuperUser.

I had to add a new link button “Make SuperUser” to ManagedUsers.ascx. Some code was added to hide the button according to user permissions(set Visible=false for a new button in the same places where cmdManageRoles.visible=false)

In Click event I've added call to add user to Asp.NET membersip (“dnn-1“ application for SuperUser) and update dnn_user table to set SuperUser=1. The current UserController.UpdateUser method doesn't allow to change SuperUser flag, so new Stored Procedure and method has to be created.

        Protected Sub cmdSuperUser_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdSuperUser.Click

            ' update the user record in the database

            If Not UserInfo.IsSuperUser Then Exit Sub 'Only SuperUser can make another SuperUser

            Dim objUsers As New UserController

            Dim ObjUser As UserInfo

            ObjUser = objUsers.GetUser(PortalId, UserId)

            If Not ObjUser Is Nothing AndAlso ObjUser.IsSuperUser = False Then

'Required to force load from AspNetSecurity.Membership.GetUser 'see https://geekswithblogs.net/mnf/archive/2006/03/15/72324.aspx Dim userMembership As Entities.Users.UserMembership = ObjUser.Membership

                ObjUser.PortalID = -1

                ObjUser.IsSuperUser = True

                Dim objStatus As AspNetSecurity.MembershipCreateStatus = UserController.CreateInMembershipProvider(ObjUser)

                Select Case objStatus

                    Case MembershipCreateStatus.Success, MembershipCreateStatus.DuplicateUserName

                        'Update User doesn't update IsSuperUser flag

                        SetSuperUser(ObjUser)

                    Case Else

                        UI.Skins.Skin.AddModuleMessage(Me, objUsers.GetRegistrationStatus(objStatus), UI.Skins.Controls.ModuleMessage.ModuleMessageType.YellowWarning)

                End Select

            End If

        End Sub

        'Should be a part of UserController

        Public Sub SetSuperUser(ByVal objUser As UserInfo)

            Dim objSecurity As New PortalSecurity

            Dim objUserController As New UserController

            'HACK, should be methods in DataProvider and SQlDataProvider,

            'SP with DatabaseOwner & ObjectQualifier

            'DataProvider.Instance.SetSuperUser(objUser.UserID,ObjUser.IsSuperUser )

            Dim sSQL As String = "exec dbo.dnn_User_SetSuperUser " & objUser.UserID & ", " & Convert.ToInt16(objUser.IsSuperUser)

            Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(DotNetNuke.Common.Utilities.Config.GetConnectionString, CommandType.Text, sSQL)

        End Sub

I've also re-factor UserController class to separate function CreateInMembershipProvider that was a part of AddUser Function.

        'mnf 16/3/2006 added to call from SetAsSuperUser

        Public Shared Function CreateInMembershipProvider(ByVal objUser As UserInfo) As AspNetSecurity.MembershipCreateStatus

            'Dim UserId As Integer = -1

            'Dim Status As UserRegistrationStatus

            Dim objSecurity As New PortalSecurity

            Dim objStatus As AspNetSecurity.MembershipCreateStatus = AspNetSecurity.MembershipCreateStatus.Success

            If objUser.IsSuperUser Then

                Common.Globals.SetApplicationName(Common.Globals.glbSuperUserAppName)

            Else

                Common.Globals.SetApplicationName(objUser.PortalID)

            End If

            Dim objMembershipUser As AspNetSecurity.MembershipUser

            objMembershipUser = AspNetSecurity.Membership.CreateUser(objSecurity.InputFilter(objUser.Membership.Username, PortalSecurity.FilterFlag.NoScripting Or PortalSecurity.FilterFlag.NoMarkup), objUser.Membership.Password, objSecurity.InputFilter(objUser.Membership.Email, PortalSecurity.FilterFlag.NoScripting Or PortalSecurity.FilterFlag.NoMarkup), Nothing, Nothing, objUser.Membership.Approved, objStatus)

            Return objStatus

        End Function

The Stored Procedure is created in the following script:

SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO

create  procedure {databaseOwner}{objectQualifier}User_SetSuperUser @UserId         int, @IsSuperUser    bit

as

update {databaseOwner}{objectQualifier}Users set    IsSuperUser=@IsSuperUser where  UserId = @UserId

GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO

This article is part of the GWB Archives. Original Author: Michael Freidgeim

New on Geeks with Blogs

  • We Won The One Award I Actually Care About

    Full Scale made the Inc. 5000 for the fifth year straight, the 12th listing across my three companies. Here is why the one award you cannot buy is worth stopping for.

  • Your Customers Build the Features Now

    I let a tool I liked sit dead for a year rather than build the features I wanted. An MCP server meant I never had to, and your customers can do the same to your product.

  • Get the Size of a Directory in Linux the Easy Way

    du -sh for the quick answer, ncdu for the cleanup, df for the disk itself: every command for checking directory size in Linux, plus why du and df never agree.

  • Vim Search and Replace: The Ultimate Guide

    One :%s command replaces every match in a file before a find dialog would even open. The Vim substitute patterns worth the muscle memory: flags, ranges, capture groups, and multi-file edits.