65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 中 Windows 登录,Web 用户控件实现

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (16投票s)

2003年11月25日

5分钟阅读

viewsIcon

236113

downloadIcon

3317

这是一个实现可重用 Web 用户控件的经典示例,其中包含支持控件和类,以使代码更易于管理。

Sample Image - ASPdotnet_LoginControl.gif

概述

本文旨在通过 .NET 中的模拟(impersonation)命名空间,使用用户的 Windows 登录凭据,通过网页来实现用户登录。传统上,使用 Windows 身份验证登录用户的方法是在 IIS 中启用 Web 应用程序的 Basic Authentication 属性。

但是,通过该控件,我们可以不必通过 IIS 控制登录,而是通过我们的代码来实现。这为通过代码进行控制提供了相当大的空间。因此,我们可以控制请求哪个用户登录、哪个域等等。

我们将讨论项目的创建以及我在开发过程中考虑的逻辑。本文附带了使用 VS.NET 开发的已完成并经过测试的代码。

引言

我们创建了两个 Web 用户控件。

  • WindowsLoginControl

    这包含了登录面板的实现和 UI。它有两个 UI:一个用于新用户,一个用于已登录用户。会话变量维护登录状态以确定显示哪个 UI。此控件中的代码调用 logInUser 类的共享方法来处理登录。

  • ErrorControl

    这包含了错误报告面板的实现和 UI。当发生错误时,页面上的其他控件会更新一个 session 变量,该变量在控件加载时会被检查。如果没有错误,我们将显示“建设中”消息(正式版本中可能会删除此消息)。

注意:我们也可以将此控件的逻辑实现到 WindowsLoginControl 中,但将其作为单独的控件可以让我们在 VS.NET 的目标页面 UI 中轻松移动该控件。

  • 一个 LoginUser 类,带有一个用于处理登录的共享方法

    这包含登录过程的实现。一个共享方法以用户名、密码和域作为参数,并尝试使用这些数据进行 Windows 登录,然后我们模拟该用户。

  • 一个注销页面,用于清除用户会话并使其失效。

    这是为了清理会话,并使系统中 totalActiveUser 的计数更可靠。

代码

打开一个 ASP.NET 项目。在解决方案资源管理器中选择项目,然后创建一个新的“Web 用户控件”项。为此开发 UI……可能需要两个文本框……用于用户名和密码,以及一个“登录”按钮。

我们创建另一个 UI,它显示一个具有用户登录详细信息的视图面板。

当用户未登录系统时,我们显示登录表单;当用户登录后,我们显示登录详细信息视图。用户使用他们的 Windows 身份验证登录(这意味着我们必须已经在服务器和域上创建了用户才能正常工作)。

windowsLoginControl 调用 LogInUser 类中名为 LogInThisUser() 的共享函数,该函数登录用户并模拟已登录的用户。执行此操作的代码如下:

Dim loggedOn As Boolean = LogonUser(username, _ 
        domainname, password, 3, 0, token1)
'impersonate user
Dim token2 As IntPtr = New IntPtr(token1)
Dim mWIC As WindowsImpersonationContext = _
    New WindowsIdentity(token2).Impersonate

为此,我们声明 loginuser 类并包含适当的命名空间,并以一种包含非托管代码的方式进行。我们需要编写非托管代码,因为我认为我们没有 LogonUser Windows 函数的原生代码实现来完成此操作。

'include permissions namespace for security attributes
'include principal namespace for windowsidentity class
'include interopservices namespace for dllImports.

Imports System.Security.Principal
Imports System.Security.Permissions
Imports System.Runtime.InteropServices

<Assembly: SecurityPermissionAttribute
  (SecurityAction.RequestMinimum, UnmanagedCode:=True)> 
Public Class LogInUser

    <DllImport("C:\\WINDOWS\\System32\\advapi32.dll")> _
    Private Shared Function LogonUser(ByVal _ 
        lpszUsername As String, ByVal lpszDomain _
        As String, ByVal lpszPassword As String, _
        ByVal dwLogonType As Integer, _ 
        ByVal dwLogonProvider As Integer, _
        ByRef phToken As Integer) As Boolean
    End Function

    <DllImport("C:\\WINDOWS\\System32\\Kernel32.dll")> _
    Private Shared Function GetLastError() As Integer
    End Function

我们还可以通过调用 GetLastError 方法来检查 logonuser 函数是否生成了错误。

我们使用 session 变量来跟踪用户的登录信息和最后访问时间。我们使用应用程序变量来跟踪系统中总的在线用户数。

下面的代码是此实现的一部分(可在 windowsLoginControl.ascx.vb 中找到)

Session.Add("LoggedON", True)
Session.Add("Username", sRetText)

Application.Item("TotalActiveUsers") += 1

lblUserName.Text = Session("Username")
lblLastSession.Text = Session("LastActive")
lblTotalUsers.Text = Application("TotalActiveUsers")

我们通过在登录方法成功时简单地增加值,在 session_end 事件发生时减少值来跟踪在线用户数。

也可以使用更好的方法来实现这一点。本文的目的是仅传达逻辑。

测试项目

在测试项目之前,我们应检查以下内容。

我们将 domainname 保持为常量,而不是作为用户输入。检查是否已为常量分配了正确的域名。

Private Const domainName = "TestDomain"

检查正在导入的 DLL 的位置是否正确。

<DllImport("C:\\WINDOWS\\System32\\advapi32.dll")>

检查注销页面的页面名称和路径是否正确,以便在清理完成后将用户重定向到该页面。

Server.Transfer("webform1.aspx")

代码注意事项

必须注意,所实现的 L 代码不应允许通过各种 userLogin 进行不当使用。

我选择将域名硬编码到应用程序中,通过一个常量而不是作为用户输入来接受,这样可以更轻松地限制或监控用户登录会话。

对于内网项目,我们可以为该项目创建一个单独的域和用户组,并使用上述逻辑来允许用户仅在该特定域上登录系统。也许你可以称之为“一个想法”:o)

在另一个 Web 项目中使用控件

要在 Web 项目中实现 Web 用户控件,我们只需将与这两个控件相关的 L 文件、loginuser 类、注销用户页面复制到我们的新 Web 项目中,并将我们 global.asax.vb 中的 L 代码复制到新项目的 global.asax.vb 中。

在 VS.NET 中,可以通过右键单击并选择解决方案资源管理器中的“包含到项目”来轻松地将这些复制的文件包含到目标项目中。

代码可扩展性

本文中实现的 L 代码将仅对 Web 应用程序的单个页面进行用户身份验证。通常,Web 应用程序会在站点内包含一些内容供已通过身份验证的用户查看……在这种情况下,控件必须具有在页面请求之间保留用户身份验证的机制。这可以通过将已通过身份验证用户的 windowsIdentity 对象保存在 session 变量中,并通过使用 System.Security 命名空间中的 FileIOPermission 和其他类来允许用户拥有页面的权限来完成。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

ASP.NET 中 Windows 登录,Web 用户控件实现 - CodeProject - 代码之家
© . All rights reserved.