C# 特定代码、控制器、型号或其他位置的正确位置
我已经开始学习C#MVC5,用于我工作的房间清单项目。 我正在使用active directory对用户进行身份验证,然后将这些详细信息存储在数据库中,这样我就可以将用户分配到已分配项目的房间和租约中 我使用了VisualStudio2013附带的库存MVC5模板,因为我只有一个月的时间来完成项目,之前没有任何知识,也没有时间编写外观奇特的html/css前端,我依赖于现成的外观 我编写了一些代码,一旦用户使用与AD链接的表单身份验证成功登录,它将运行一个检查以查看数据库中是否存在用户,如果不存在,它将创建一个,如果存在,它将检查是否已将其设置为非活动,并在需要时重新激活它 我已将此代码放置在AccountController的登录httppost操作下。由于我是MVC新手,我想检查一下这是否是正确的位置,或者我是否应该为这个功能创建一个新类,或者它是否应该位于我首先使用实体框架代码创建数据库的模型区域。最佳做法是什么 这是代码,提前感谢您的帮助。我为这篇长篇大论的文章和不太精彩的代码道歉。不要对任何批评置之不理,因为我宁愿现在就接受批评,也不愿一次又一次地犯错误C# 特定代码、控制器、型号或其他位置的正确位置,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我已经开始学习C#MVC5,用于我工作的房间清单项目。 我正在使用active directory对用户进行身份验证,然后将这些详细信息存储在数据库中,这样我就可以将用户分配到已分配项目的房间和租约中 我使用了VisualStudio2013附带的库存MVC5模板,因为我只有一个月的时间来完成项目,之前没有任何知识,也没有时间编写外观奇特的html/css前端,我依赖于现成的外观 我编写了一些代码,一旦用户使用与AD链接的表单身份验证成功登录,它将运行一个检查以查看数据库中是否存在用户,如果不存
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Put this method in place to allow multiple domains for login. References Web.config for providers
MembershipProvider domainProvider;
switch (model.Domain)
{
case "Student":
domainProvider = Membership.Providers["studentADMembershipProvider"];
break;
case "Staff":
domainProvider = Membership.Providers["staffADMembershipProvider"];
break;
default:
throw (new Exception("This domain is not supported"));
}
// Method for authenticating users on AD to allow system integration and also add or update user in Users Database
if (domainProvider.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
//Code for creating new user based on successfull logged in user.
//define which domain to link too. otherwise will always default to staff
PrincipalContext myContext;
if (model.Domain == "Staff")
{
myContext = new PrincipalContext(ContextType.Domain, "staff.domain.com");
}
else
{
myContext = new PrincipalContext(ContextType.Domain, "student.domain.com");
}
UserPrincipal aduser = UserPrincipal.FindByIdentity(myContext, IdentityType.SamAccountName, model.UserName);
//Check for existence of user with username that matches loged in user
var userSearch = db.Users.Count(b => b.Username == aduser.SamAccountName);
if (userSearch == 0)
{
// User does not exist, therefore create user
User user = new User()
{
IsActive = 1,
Username = aduser.SamAccountName,
FirstName = aduser.GivenName,
LastName = aduser.Surname,
Extension = aduser.VoiceTelephoneNumber,
Email = aduser.EmailAddress,
UserTypeId = 3
};
db.Users.Add(user);
db.SaveChanges();
}
else
{
// User does exist, but has been deactivated, therefore reactivate
var activateUser = db.Users.FirstOrDefault(d => d.Username == aduser.SamAccountName);
if (activateUser.IsActive == 0)
{
activateUser.IsActive = 1;
db.SaveChanges();
//db.Users(activateUser.UserId).State = EntityState.Modified;
}
}
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError(string.Empty, "The user name or password provided is incorrect.");
return View(model);
}
我个人会封装您的所有数据库活动,我认为您的控制器操作不应该太大。将所有数据库保存等移到另一层,并隐藏控制器的实现细节(因为它不需要知道)。您应该真正了解一下默认的Identity 2.0框架。这对你会有很大的帮助。基本上就像杰米说的——你不应该直接在你的账户管理员中使用数据库。看一看生成的默认ASP.NET帐户控制器-它使用UserManager和SignInManager进行用户操作。非常感谢你们两位的快速回复,非常感谢。我现在要离开这里,读一读上面提到的一些概念。我查看了默认asp.net站点中的类。接下来,为了包装一个新层,我会在App_数据文件夹中创建一个新类,并将方法移动到该类吗?回到这个老问题,我已经问了两年多了,其他人都在寻找答案,有一篇非常好的博文详细介绍了单片ASP.NET MVC应用程序的结构:这篇博文详细介绍了如何拆分数据库交互、服务层和控制器\视图逻辑,我建议任何好奇的人都来看看。