MVC3 + 如何获取当前已登录用户的用户名

6
我对MVC和网站开发都是新手。我有7年的开发经验,但是主要是在服务、数据库、对象模型等方面,基本上属于中间层和后端开发。我正在尝试学习ASP.NET,并决定使用MVC3为个人网站构建站点。我将从dotnet-hosts.com的账户进行托管。这是我的问题……我没有域名,并且将使用内置的成员资格提供程序。我注意到,在添加项目模板时生成的自动代码中,在AccountControllerChangePassword方法中(ChangePasswordModel model),有一行代码……
MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);

我的问题与User.Identity.Name相关,它看起来像是返回Windows用户名的,就像Environment.UserName一样。我使用的是Visual Studio模板(Mobile Ready HTML5 MVC.NET),因为我希望能够支持任何设备的客户端...Windows PC、苹果、Windows Phone、iPhone等等。如果调用User.Identity.Name是正确的,那么我想问的是,在不是Windows设备上,比如iPhone上这个怎么工作呢?如果我的假设是正确的,那么这只适用于带域的Windows计算机,那么我该怎么做呢?我需要使用一些缓存吗?如果是这样,我可以从身份验证页面获取用户名和IP地址作为缓存键吗?

我的高级问题是...无论设备/平台如何,我如何获取当前登录用户的用户名?我知道这个问题可能写得不好,可能很难理解...对此我感到抱歉。我是Web开发新手,正在尝试入门,并希望开始使用最新的技术。

2个回答

6
调用是正确的。无论使用什么身份验证提供程序(Windows身份验证,表单身份验证,某些自定义身份验证提供程序或其他),User.Identity.Name都会被填写。它不绑定到特定的用户“类型”。身份验证提供程序负责确保每个请求的Identity对象对应于当前用户。通常,使用cookie和数据库的组合来处理该部分。
MVC模板(尽管我还没有查看MVC 2以来的模板)使用ASP.NET的Membership类,该类又使用成员资格提供程序,例如SqlMembershipProviderActiveDirectoryMembershipProvider——前者将用户的凭据(用户名和密码等)存储在SQL Server数据库中,而后者使用Active Directory(即主要是Windows登录)。SqlMembershipProvider是默认值,并且MVC设置为使用本地SQLExpress数据库文件作为其用户存储。
模板项目中实现的身份验证提供程序使用FormsAuthentication,该提供程序通过简单的HTML表单(在LogOn视图中的表单)执行登录过程,并通过加密cookie使用户保持登录状态。适用于任何平台。 FormsAuthenticationSqlMembershipProvider的设置可以在web.config中找到(站点根目录中的一个)。在那里,您可以找到SQLExpress数据库的连接字符串(例如,将它们更改为使用“真正的”SQL Server,如果需要),登录超时等。
(请注意,您可以通过Visual Studio中Solution Explorer工具栏中的“ASP.NET Configuration”按钮轻松地在GUI中完成大部分配置-它还提供了一种设置第一个用户的简单方法)。
简而言之,一切都已准备就绪,并且不会锁定非Windows用户。

4

像你说的那样,User.Identity.Name 确实是正确的。用于返回登录用户的名称。但是像你所说的成员资格部分,只提供 windows 帐户。您可以使用类似的方法,而不需要使用 windows 帐户,在每种情况下都能正常工作,并且仍然可以根据需要验证 windows。如果不使用成员资格,按照默认的 MVC3 模板操作应该也能正常工作。

String Username = User.Identity.Name;

当你使用MVC3模板登录时,它会创建一个authcookie请参见账户控制器代码。在这里,传递了两个参数。用户名和持续时间(当浏览器关闭时,登录仍然被缓存)。

用户名是一个字符串字段,可以通过User.Identity.Name进行调用。实际上,任何内容都可以放入其中,并且与Windows登录无任何关联。

您可以通过所需的方法测试登录,如果成功,则使用authcookie方法设置cookie(经过加密)。并将用户名设置为任何您想要的内容。如果用户验证失败,请不要创建用户,并将页面重定向回去。

请参见示例代码。由于我没有代码作为参考,所以这些都是从记忆中得出的。但所有内容都在账户控制器的登录操作中。

当设置cookie时,用户的登录状态将被缓存到会话中。您需要确保访问网页时用户已登录。否则登录将毫无意义。这是控制器/操作上的简单属性。

注意:不要对Account/logon控制器执行此操作,因为您无法访问登录页面,因为您尚未登录。

[Authorize]
public ActionResult DoSomething()
{
    // ...
}

希望我有所帮助。


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