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

nul*_*ull 6 c# asp.net-mvc razor asp.net-mvc-3

我是MVC的新手,实际上是Web开发的新手.我有大约7年的开发经验,但在服务,数据库,对象模型等方面......基本上是中间层和后端开发.我正在尝试学习ASP.NET,并决定使用MVC3为我自己的个人网站构建一个站点.我将通过dotnet-hosts.com上的一个帐户托管这个.这是我的问题...我没有域名,我将使用内置的成员资格提供程序.我注意到在我添加项目模板时创建的自动生成的代码,AccountController在方法ChangePassword(ChangePasswordModel模型)中有这行代码...

MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
Run Code Online (Sandbox Code Playgroud)

我的问题是具体的User.Identity.Name,这看起来像将返回Windows用户名Environment.UserName.我使用的Visual Studio模板是(Mobile Ready HTML5 MVC.NET),因为我希望能够从任何设备支持客户端... Windows PC,Apple,Windows Phone,iPhone等...如果呼叫User.Identity.Name是那么我想问一下,这对于不像iPhone这样的Windows设备有什么用?如果我的假设是正确的,这只适用于具有域的Windows计算机,那么我该如何实现呢?我是否需要使用一些缓存?如果是这样,我可以从认证页面获取用户名和IP地址作为缓存密钥吗?

我的高级问题是......无论设备/平台如何,我如何获得当前登录用户的userName?我知道这个问题可能写得不好而且可能很难理解......我为此道歉.我是网络开发的新手,并试图让我的脚湿透,并希望开始使用最新的技术.

Jim*_*iTh 6

电话是正确的.在User.Identity.NameWindows身份验证,表单认证,一些自定义的身份验证提供者,或任何-由任何身份验证提供者在使用中填写.它不受特定用户"类型"的约束.身份验证提供程序负责确保Identity对象在每个请求上对应于当前用户.通常使用cookie和数据库的组合来处理该部分.

MVC模板(虽然我从未看过模板,因为MVC 2)使用ASP.NET的Membership类,后者又使用成员资格提供者 - 例如SqlMembershipProviderActiveDirectoryMembershipProvider- 前者存储用户的凭据(用户名和密码等). )在SQL Server数据库中,后者使用Active Directory(即主要是Windows登录).SqlMembershipProvider是默认设置,MVC设置为使用本地SQLExpress数据库文件作为其用户存储.

在模板项目中实现的身份验证提供程序使用FormsAuthentication,它通过简单的HTML表单(LogOn视图中的表单)执行登录过程,并通过加密的cookie保持用户登录.适用于任何平台.

可以在web.config(站点根目录中的那个)中找到FormsAuthentication和SqlMembershipProvider的设置.在那里,您可以找到SQLExpress数据库的连接字符串(例如,如果需要,可以将它们更改为使用"真正的"SQL Server),登录超时等.

(请注意,您可以通过Visual Studio中解决方案资源管理器工具栏中的"ASP.NET配置"按钮在GUI中轻松完成大量配置 - 它还提供了一种设置第一个用户的简便方法).

简而言之,它已经准备就绪 - 并且不会锁定非Windows用户.


Doo*_*ght 4

就像你说的User.Identity.Name确实是正确的。用于返回登录的用户名。但正如你所说,会员部分只提供 Windows 帐户。您可以在没有 Windows 帐户的用户的情况下使用类似的功能,在每种情况下工作,并且仍然可以针对 Windows 进行验证(如果存在)。如果您在没有成员资格的情况下调用它,并遵循默认的 MVC3 模板,它应该可以正常工作。

String Username = User.Identity.Name;
Run Code Online (Sandbox Code Playgroud)

当您使用模板 MVC3 登录时,它会创建一个authcookie. 请参阅帐户控制器代码。这里,有两个参数传入其中。用户名,并保留(当浏览器关闭时 - 登录信息仍然被缓存)。

用户名是一个字符串字段,实际上User.Identity.Name,任何内容都可以放入其中,并且无论如何都不会链接到 Windows 登录。

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

请参阅示例代码。这全是凭记忆,因为我面前没有代码可供参考。但这一切都在帐户控制器登录操作中。

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

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

[Authorize]
public ActionResult DoSomething()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

希望我有所帮助。