HttpContext.Current.User.Identity.Name怎么知道哪些用户名存在?

51

这并不一定是一个问题,我只是想知道它是如何工作的。我有一个方法:

public static bool UserIsAuthenticated()
{
    bool isAuthed = false;
    try
    {
        if (HttpContext.Current.User.Identity.Name != null)
        {
            if (HttpContext.Current.User.Identity.Name.Length != 0)
            {
                FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                FormsAuthenticationTicket ticket = id.Ticket;
                isAuthed = true;
                string MyUserData = ticket.UserData;
            }
        }
    }
    catch { } // not authed
    return isAuthed;
}

HttpContext.Current.User.Identity.Name如果用户不存在,则返回null,但是它是如何知道哪些用户名存在或不存在的呢?


用户已通过身份验证吗? - Liath
8个回答

57

对于Windows身份验证

选择您的项目。

按F4键

禁用“匿名身份验证”,启用“Windows身份验证”

输入图像描述


4
似乎这并没有解决“HttpContext如何知道哪些用户名存在?”这个问题。 - TylerH

32

HttpContext.Current.User.Identity.Name返回null值

这取决于您的web.config文件中身份验证模式是设置为Forms还是Windows

例如,如果我像这样编写身份验证:

<authentication mode="Forms"/>

因为验证模式为“Forms”,所以我将得到用户名为空的结果。但是,如果我将验证模式更改为 Windows:

<authentication mode="Windows"/>
我可以再次运行应用程序并检查用户名,然后成功获得用户名。
了解更多信息,请参见ASP.NET中的System.Web.HttpContext.Current.User.Identity.Name与System.Environment.UserName

7
谢谢您的问题,但我需要进一步了解。您的方法有效,但您不理解 HttpContext.Current.User.Identity.Name 是如何设置的? - Srb1313711

7

[HttpContext.Current.User]如何知道哪些用户名存在或不存在?

让我们看一个例子,说明它是如何工作的。假设您正在使用表单身份验证,并且"OnAuthenticate"事件触发。这个事件发生在"应用程序对当前请求进行身份验证"(参考源)时。

到此为止,应用程序不知道您是谁。

由于您正在使用表单身份验证,它首先通过调用ExtractTicketFromCookie解析身份验证cookie(通常是.ASPAUTH)。这会调用FormsAuthentication.Decrypt(此方法是公共的; 您可以自己调用它!)。接下来,它调用Context.SetPrincipalNoDemand,将cookie转换为用户并将其放入Context.User中(参考源代码)。

5
假设一个网络环境,需要“用户”(即你)来登录。通常情况下,需要输入用户ID(UID)和密码(PW)。那么,你的身份是什么?你就是这个UID,它从你的登录会话中获取了“名称”。很简单!在需要登录的互联网应用程序(如Best Buy等)中也是同样的流程。
当我打开所需Web应用程序的默认页面时,它会从我的会话中提取我的UID或“名称”。现在,在我的实例中,我属于一个域,因此我可以使用最初的Windows身份验证,并且需要验证我的身份,因此有第二部分代码。对于表单身份验证,它将依赖于发送到您工作站/计算机的票证(可能是Cookie)。代码如下:
string id = HttpContext.Current.User.Identity.Name;

// Strip the domain off of the result
id = id.Substring(id.LastIndexOf(@"\", StringComparison.InvariantCulture) + 1);

现在它拥有我的企业名称(即 UID),并可以在屏幕上显示出来。

3
请确保以下内容也正确:
<modules>
      <remove name="FormsAuthentication"/>
</modules>

如果你发现任何类似这样的内容,请将其删除:

<remove name="FormsAuthentication"/>

在web.config文件中找到该行代码,然后你就可以顺利使用了。我已经测试过了,非常好用。


1
这似乎没有回答“HttpContext如何知道哪些用户名存在?”的问题。 - TylerH

1

Windows身份验证提供了有关已登录用户的信息。以下是如何在您的项目中设置Windows身份验证:

您可以从菜单栏中选择项目,选择“yourProject属性”,选择“调试”,并勾选下面的图像中的“启用Windows身份验证”。

enter image description here

然后你就可以通过在任何控制器中运行此代码来知道已登录的用户

var strUserName = User;

1
实际上并不是这样!它只保存当前已登录用户的用户名。在成功登录认证后,登录认证系统会自动将用户名存储到“HttpContext.Current.User.Identity.Name”属性中。
为了检查当前用户是否经过身份验证,您必须(出于安全原因)检查“HttpContext.Current.User.Identity.IsAuthenticated”布尔属性,该属性自动保存此信息,而无需编写自己的代码。
如果当前用户未经过身份验证,“HttpContext.Current.User.Identity.Name”属性将为null、空字符串或“可能采用其他值”(https://learn.microsoft.com/en-us/dotnet/api/system.security.principal.iidentity.name?view=netframework-4.8),具体取决于所使用的身份验证模式。
请参阅:https://learn.microsoft.com/en-us/dotnet/api/system.security.principal.iidentity?view=netframework-4.8

0

在.NET中进行HTTP请求时,使用HttpContext.Current.User.Identity.Name属性检索当前用户的名称时,HTTP请求中不会发送特定的标头。

相反,当用户登录.NET Web应用程序时,将在用户的浏览器中设置身份验证cookie。在用户浏览Web应用程序时,此cookie将发送到所有后续请求。该cookie包含身份验证信息,例如用户名和安全令牌,用于在服务器上验证用户的身份。

调用HttpContext.Current.User.Identity.Name属性时,.NET使用存储在cookie中的身份验证信息来识别当前用户并检索其名称。没有发送特定的标头以检索此信息,而是使用每个用户发出的后续请求中发送的身份验证cookie中存储的信息。

如果IIS服务器配置为使用Windows身份验证,则在用户成功验证后,服务器将自动生成身份验证令牌。

要访问服务器生成的身份验证令牌,可以在服务器上访问HttpContext.Current.User.Identity属性。Identity对象包含有关经过身份验证的用户的信息,例如他们的用户名和安全角色。

针对HTTP请求,认证令牌将自动以身份验证cookie的形式发送到客户端。客户端可以在随后的请求中包括此cookie以验证其身份。

需要注意的是,Windows认证的使用方式和访问认证令牌的方法可能因服务器实现和开发平台而异。因此,建议查询相应文档以获取更多信息。

要确切了解IIS服务器使用的Windows认证机制,可以按照以下步骤操作:

  1. 在服务器上打开Internet信息服务(IIS)管理器。
  2. 在导航树中选择要检查的网站。
  3. 单击右侧功能面板中的“身份验证”图标。
  4. 在身份验证提供程序列表中,您将看到已为该网站启用的Windows认证机制列表。

通常,在IIS中有各种Windows身份验证机制可用,如基本身份验证、NTLM身份验证、Kerberos身份验证、集成Windows身份验证等。

如果您想了解有关服务器上身份验证的详细信息,可以从列表中选择一种Windows身份验证机制,然后单击“编辑”以获取有关其配置和操作的更多信息。您也可以参考Microsoft文档,了解如何在IIS中配置和使用Windows身份验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接