📄 loginform.vb
字号:
Imports System.Data
Imports System.IO
Imports System.Reflection
Imports System.Security.Cryptography
Imports Microsoft.Practices.Mobile.PasswordAuthentication
Imports Microsoft.Practices.Mobile.Configuration
Public Class LoginForm
Private users As DataSet
Private configSettings As Dictionary(Of String, String) = Nothing
Public Sub New(ByVal settings As Dictionary(Of String, String))
InitializeComponent()
configSettings = settings
End Sub
Private Sub LoginForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Cursor.Current = Cursors.WaitCursor
Try
' Get the user details
users = New DataSet()
users.ReadXml(GetApplicationDirectory() + "\Users.xml")
Finally
Cursor.Current = Cursors.Default
End Try
End Sub
Private Function GetApplicationDirectory() As String
Return Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetModules(0).FullyQualifiedName)
End Function
Private Function AuthenticateUser(ByVal userToken As String) As PasswordIdentity
Using provider As RsaAesCryptographyProvider = New RsaAesCryptographyProvider("MobileDevelopersHandbook")
' Create AuthenticationToken using existing token
Dim token As AuthenticationToken = New AuthenticationToken(userToken)
Dim identity As PasswordIdentity = token.Authenticate(textBoxUsername.Text, textBoxPassword.Text, provider)
' return result - caller checks Authenticated property to see authentication result
Return identity
End Using
End Function
Private Sub DecryptSettings(ByVal identity As PasswordIdentity, ByVal userEncryptedConfigurationKey As String)
' Obtain the user's key
Dim userKeyBytes() As Byte = identity.CryptoKey
' Create an instance of the CryptographyBlock class
Dim symmetric As SymmetricAlgorithm = Rijndael.Create()
Dim block As CryptographyBlock = New CryptographyBlock(symmetric, userKeyBytes)
' Get the user's encrypted configuration key
Dim configKeyBytes() As Byte = Convert.FromBase64String(userEncryptedConfigurationKey)
' Decrypt the key
Dim configurationKey() As Byte = block.Decrypt(configKeyBytes)
' Create a configuration provider to decrypt the config file
Dim configProvider As RijndaelConfigurationProvider = New RijndaelConfigurationProvider(configurationKey)
' Assign the new instance of the RijndaelConfigurationProvider class to the ConfigurationManager.
ConfigurationManager.ProtectedConfigurationProvider = configProvider
' Finally, use the GetSection method of the ConfigurationManager to retrieve the section we want
Dim sectionName As String = "SystemSettings"
Dim configSection As SystemSettingsSection = CType(ConfigurationManager.GetSection(sectionName), SystemSettingsSection)
' Store the decrypted data in the settings collection
Dim item As SystemSettingsItemElement
For Each item In configSection.SystemSettingsItems
configSettings.Add(item.Name, item.Value)
Next
End Sub
Private Sub menuSubmitMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuSubmitMenuItem.Click
Dim rowidx As Integer
For rowidx = 0 To users.Tables(0).Rows.Count - 1 Step rowidx + 1
Dim userRow As DataRow = users.Tables(0).Rows(rowidx)
If CType(userRow("Name") = textBoxUsername.Text, String) Then
Cursor.Current = Cursors.WaitCursor
Try
Dim identity As PasswordIdentity = AuthenticateUser(CType(userRow("Token"), String))
If Not identity Is Nothing And identity.IsAuthenticated Then
' Success!! Decrypt the config file
DecryptSettings(identity, CType(userRow("encKey"), String))
'Close the modal dialog
Me.DialogResult = DialogResult.OK
End If
Finally
Cursor.Current = Cursors.Default
End Try
End If
Next
' Show the login failed message
labelIncorrect.Visible = True
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -