我有一个应用程序,其中一个用户名可以属于许多公司。因此,为了区分它们,我需要使用用户名和密码作为唯一对登录。
我正在使用 ASP.NET MVC,但我很难理解登录发生的位置。实际上我可以看到它在哪里验证用户,但我没有找到它在哪里检索用户。
那么在哪里
选择出现 username=xx 和 password=xx 的用户?
不同地问:我没有找到用户设置在哪里?我在代码中看到了 User.Identity.Name 它,但我没有看到:User=Select....
谢谢约翰
我有一个应用程序,其中一个用户名可以属于许多公司。因此,为了区分它们,我需要使用用户名和密码作为唯一对登录。
我正在使用 ASP.NET MVC,但我很难理解登录发生的位置。实际上我可以看到它在哪里验证用户,但我没有找到它在哪里检索用户。
那么在哪里
选择出现 username=xx 和 password=xx 的用户?
不同地问:我没有找到用户设置在哪里?我在代码中看到了 User.Identity.Name 它,但我没有看到:User=Select....
谢谢约翰
约翰,因为您正在使用 MVC。除了 LINQ 语法之外,您不会在代码中看到任何查询。我猜你想要做的是用户表和公司表之间的多对多关系。(一个用户有多个公司,1 个公司有多个用户)在数据库方面,这意味着您需要一个额外的表,其中包含 Company 和 Users 的主键。
回到你的问题。ASP.net MVC 有自己的成员资格提供程序。您可以选择使用带有自己的表的默认表或覆盖它并创建您自己的自定义成员资格提供程序(能够使用您自己的用户表)
默认值几乎应该包含大部分基本属性。(密码重置,密码盐,电子邮件,..) http://www.asp.net/web-forms/tutorials/security/membership/creating-the-membership-schema-in-sql-server-cs 跳到步骤:安装应用程序服务以生成表
但是,猜测您已经拥有一个带有您自己的用户表的数据库。您应该覆盖自定义成员资格类。
简单地说,这意味着您创建了一个继承自抽象类“MembershipProvider”的新类
public class MyMembershipProvider : MembershipProvider
{
}
之后,您必须让 asp 知道您将在web.config中用您的默认成员资格提供程序覆盖:
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear />
<add name="MyMembershipProvider"
applicationName="MyApp"
Description="My Membership Provider"
passwordFormat="Clear"
connectionStringName="MyMembershipConnection"
type="MyApp.MyMembershipProvider" />
</providers>
</membership>
成员资格提供程序中的某些方法要求您返回或使用MembershipUser的对象。如何实现这一点的一切都在这里:http: //msdn.microsoft.com/en-us/library/system.web.security.membershipuser.aspx 这不是必要的步骤,但它是推荐的。
祝你好运约翰 :) 如果解释中有任何混淆,请不要犹豫,问
简短的回答:
您描述的代码发生在帐户控制器的 LogOn 操作的幕后:
MembershipService.ValidateUser(model.UserName, model.Password)
对于有效用户返回 true。然后用户使用代码中的下一行“登录”:
FormsService.SignIn(model.UserName, model.RememberMe)
(您可以在 Models 文件夹下的 AccountModels 文件中看到这两个函数的定义)
如果您还想在验证用户身份时检查公司 ID,那么您需要编写自己的身份验证方法来替换 ValidateUser。这将取决于您用于商店的内容(SQL?)
但是,作为更广泛的观点,最佳实践不应允许不同用户使用相同的用户名。这只是一个坏主意,会导致麻烦。
更新:
如果我建议如何执行此操作,我建议您使用 ASP.NET Membership 的 UserProfile 方面。它旨在捕获和存储其他用户变量(例如公司),同时仍使用他们为您编写的精心构建且安全的会员资格。阅读它,但下面是我当前正在开发的应用程序中的 CreateUser 函数。请注意我如何使用配置文件来存储名字和姓氏以及用户需要重置密码的标志。
同样,这会抢占多个用户使用相同用户名的能力,但我真的认为你应该避免这种情况。
[HttpPost]
public ActionResult CreateUser(string username, string email, string first, string last, string role)
{
string password;
MembershipUser user;
//Generate a random password
password = Auth.CreateRandomPassword(6);
try
{
//Create the user
user = Membership.CreateUser(username, password, email);
//Add the user to the chosen role
Roles.AddUserToRole(username, role);
//Create the user profile
UserProfile profile = UserProfile.GetUserProfile(username);
profile.FirstName = first;
profile.LastName = last;
profile.ForcePasswordReset = true;
profile.Save();
EmailNewUser(username, email, password);
}
catch (Exception ex)
{
HttpContext.Response.StatusCode = 500;
HttpContext.Response.StatusDescription = ex.Message;
HttpContext.Response.Clear();
}
return PartialView("UserTable", Auth.Users());
}