我已经编写了自己的基于会话的身份验证。在Global.asax中,我添加了这个功能,它接受环境用户名并检查它是否存在于数据库中:
Protected Sub Session_Start(sender As Object, e As EventArgs)
Dim userData As UserLogin = _
New UserLogin(Convert.ToString(Environment.UserName))
If userData.IsValid Then
Authentication.SaveUserToSession(userData)
End If
End Sub
这就是我在身份验证类中将userstate保存到会话的方式:
Public Shared Sub SaveUserToSession(user As UserLogin)
HttpContext.Current.Session("Username") = user.Username
HttpContext.Current.Session("isValid") = user.IsValid
HttpContext.Current.Session("isAdmin") = user.IsAdmin
HttpContext.Current.Session("ID") = user.Id
End Sub
当我在视图中显示时:
<ul >
<li>Welcome @HttpContext.Current.Session("Username")</li>
</ul>
每个人都看到相同的用户名。为什么会这样?
答案 0 :(得分:2)
System.Environment.UserName
返回运行托管您网站的应用程序池的标识。
因此,在您的情况下,这始终是您的帐户。
因此,根据您实施的安全方法,您必须使用适当的方法来检索当前登录的用户名。
答案 1 :(得分:1)
根据MSDN文档Environment.UserName“获取当前登录到Windows操作系统的人员的用户名。”。
因此,让您的用户登录您的网站是没有用的,因为您始终是登录操作系统的用户,所以每个人都会获得您的数据。
答案 2 :(得分:1)
如果要创建对登录到Windows域的用户进行身份验证的Intranet网站,可以使用带有Windows身份验证的ASP.NET身份。您必须将身份验证更改为 Windows身份验证:
通常,当您访问Environment.UserName
时,获取拥有执行进程的用户的名称,并且在ASP.NET中,此用户是服务帐户(而不是从Web浏览器发送请求的用户)。但是,当您使用Windows身份验证时,此行为会更改,您现在可以使用Environment.UserName
来获取远程用户的名称。显然,这仅适用于具有Windows域的Intranet。
实际上,您不应在ASP.NET应用程序中使用Environment.UserName
,因为它会根据所使用的身份验证更改行为。相反,您可以检查基于最新版本的框架的ASP.NET应用程序中的控制器和视图中可用的User
属性,它将为您提供有关远程用户的信息,如果他或她已登录