我是MVC的新手,实际上是Web开发的新手。我有大约7年的开发经验,但在服务,数据库,对象模型等方面......基本上是中间层和后端开发。我正在尝试学习ASP.NET,并决定使用MVC3为我自己的个人网站构建一个站点。我将通过dotnet-hosts.com上的一个帐户托管这个。这是我的问题...我没有域名,我将使用内置的成员资格提供程序。我注意到在我添加了方法AccountController
(ChangePassword
模型中的ChangePasswordModel
中的项目模板时创建的自动生成的代码中,有这行代码... < / p>
MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
我的问题主要围绕User.Identity.Name
,看起来它会像Environment.UserName
那样返回Windows用户名。我使用的Visual Studio模板是(Mobile Ready HTML5 MVC.NET),因为我希望能够从任何设备支持客户端... Windows PC,Apple,Windows Phone,iPhone等...如果调用{ {1}}是正确的,那么我想问一下,这对于不像iPhone这样的Windows设备有什么用?如果我的假设是正确的,这只适用于具有域的Windows计算机,那么我该如何实现呢?我是否需要使用一些缓存?如果是这样,我可以从认证页面获取用作名称和IP地址作为缓存密钥吗?
我的高级问题是......无论设备/平台如何,我如何获取当前登录用户的userName?我知道这个问题可能写得不好而且可能很难理解......我为此道歉。我是网络开发的新手,并试图让我的脚湿透,并希望开始使用最新的技术。
答案 0 :(得分:6)
电话是正确的。 User.Identity.Name
由正在使用的任何身份验证提供程序填写 - Windows身份验证,表单身份验证,某些自定义身份验证提供程序或其他。它不会绑定到特定用户&#34;键入&#34;。身份验证提供程序负责确保Identity
对象在每个请求中对应于当前用户。通常使用cookie和数据库的组合来处理该部分。
MVC模板(虽然我从未看过模板,因为MVC 2)使用ASP.NET的Membership
类,后者又使用成员资格提供程序 - 例如{ {1}}或SqlMembershipProvider
- 前者存储您的用户&#39; SQL Server数据库中的凭据(用户名和密码等),后者使用Active Directory(即主要是Windows登录)。 ActiveDirectoryMembershipProvider
是默认设置,MVC设置为使用本地SQLExpress数据库文件作为其用户存储。
在模板项目中实现的身份验证提供程序使用SqlMembershipProvider
,它通过简单的HTML表单(FormsAuthentication
视图中的那个)执行登录过程并保持用户签名通过加密的cookie。适用于任何平台。
可以在web.config(站点根目录中的那个)中找到FormsAuthentication和SqlMembershipProvider的设置。在那里,您可以找到SQLExpress数据库的连接字符串(例如,将它们更改为使用&#34;真正的&#34; SQL Server,如果需要),登录超时等。
(请注意,您可以通过Visual Studio中解决方案资源管理器工具栏中的&#34; ASP.NET配置&#34;按钮在GUI中轻松完成大量配置 - 它还提供了一种简单的方法来设置第一批用户)。
简而言之,它已经准备就绪 - 并且不会锁定非Windows用户。
答案 1 :(得分:4)
就像你说User.Identity.Name
确实是正确的。用于返回登录用户名。但像你说的会员部分只提供Windows帐户。您可以在没有Windows帐户用户的情况下使用类似的方法在每个方案中工作,并且仍然可以针对Windows进行验证(如果存在)。如果您在没有成员资格的情况下调用它,并遵循默认的MVC3模板,它应该可以正常工作。
String Username = User.Identity.Name;
当您使用模板MVC3登录时,它会创建authcookie
。 请参阅帐户控制器代码。这里,两个参数传递给它。用户名和持久性(当浏览器关闭时 - 登录仍然被缓存)。
用户名是一个字符串字段,由User.Identity.Name
调用,实际上,任何东西都可以放入其中,并且不会以任何方式链接到Windows登录。
您可以通过所需的方法测试登录,如果是,请使用authcookie方法设置cookie。 (它的encripted)。并将用户名设置为您想要的。如果您对用户的验证失败,请不要创建一个,然后重新安装回页面。
请参阅示例代码。这完全来自记忆,因为我没有代码在我面前供参考。但它全部在帐户控制器中,登录操作。
设置cookie后,将为会话缓存用户登录状态。您需要确保用户在访问网页时已登录。否则登录将毫无意义。这是控制器/操作的简单属性。
注意:请勿对帐户/登录控制器执行此操作,因为您无法登录登录页面,因为您尚未登录。
[Authorize]
public ActionResult DoSomething()
{
// ...
}
希望我有所帮助。