Asp.net mvc 自定义UserProfile类SimpleMembershipProvider
我是MVC新手,我正在尝试构建一个小的测试应用程序,以便清楚地了解SimpleMembershipProvider在MVC4中是如何工作的。我创造了两个角色——学生和教师。我只有一个用户分配了教师角色(在Configuration.cs中硬编码),他将创建学生,并在创建新学生时,教师还将为该学生生成用户名和密码。新创建的学生将使用教师创建的用户名和密码登录到应用程序,并执行某些任务。 问题是,每当具有教师角色的用户创建一个学生时,具有教师角色的当前登录用户就会注销,而新创建的学生就会登录。我所做的是,我没有在学生模型中保留任何userid和password字段。我使用了一个绑定到注册模型的局部视图(来自AccountModels),在创建新学生时生成用户名和密码字段。我将StudentID保存在UserProfile模型中。 这是我的代码,如下所示,以进一步澄清 学生模型Asp.net mvc 自定义UserProfile类SimpleMembershipProvider,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,design-patterns,simplemembership,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Design Patterns,Simplemembership,我是MVC新手,我正在尝试构建一个小的测试应用程序,以便清楚地了解SimpleMembershipProvider在MVC4中是如何工作的。我创造了两个角色——学生和教师。我只有一个用户分配了教师角色(在Configuration.cs中硬编码),他将创建学生,并在创建新学生时,教师还将为该学生生成用户名和密码。新创建的学生将使用教师创建的用户名和密码登录到应用程序,并执行某些任务。 问题是,每当具有教师角色的用户创建一个学生时,具有教师角色的当前登录用户就会注销,而新创建的学生就会登录。我所做
public class Student
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[DisplayName("First Name")]
public string FirstName { get; set; }
[DisplayName("Last Name")]
public string LastName { get; set; }
[DisplayName("Date of Birth")]
public string DateOfBirth { get; set; }
public Gender Gender { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
这是从Configuration.cs创建的角色和具有教师角色的用户
private void SeedMemebership()
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection1",
"UserProfile", "UserId", "UserName", autoCreateTables: true);
var roles = (SimpleRoleProvider)Roles.Provider;
var membership = (SimpleMembershipProvider)Membership.Provider;
if (!roles.RoleExists("Teacher"))
{
roles.CreateRole("Teacher");
}
if (!roles.RoleExists("Student"))
{
roles.CreateRole("Student");
}
if (membership.GetUser("UserFoo", false) == null)
{
membership.CreateUserAndAccount("UserFoo", "Password");
}
if (!roles.GetRolesForUser("UserFoo").Contains("Teacher"))
{
roles.AddUsersToRoles(new[] { "UserFoo" }, new[] { "Teacher" });
}
}
控制器创建学生的操作-
//
// GET: /Student/Create
[Authorize(Roles = "Teacher", Users = "UserFoo")]
public ActionResult Create()
{
return View();
}
//
// POST: /Student/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Student student, RegisterModel model)
{
if (ModelState.IsValid)
{
try
{
db.Students.Add(student);
db.SaveChanges();
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { StudentId = student.Id });
WebSecurity.Login(model.UserName, model.Password);
return RedirectToAction("Index", "Student");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
return View(student);
}
相应意见-
@model TestApp.Models.Student
@{
ViewBag.Title = "Create";
}
<script type="text/javascript" src="~/Scripts/MyCustom.js"></script>
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Student</legend>
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DateOfBirth)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DateOfBirth)
@Html.ValidationMessageFor(model => model.DateOfBirth)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Gender)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(TestApp.Models.Gender))))
@Html.ValidationMessageFor(model => model.Gender)
</div>
<div class="float-right-top">
@Html.Partial("_PartialRegisterStudent")
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
@model TestApp.Models.Student
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
学生
@LabelFor(model=>model.FirstName)
@EditorFor(model=>model.FirstName)
@Html.ValidationMessageFor(model=>model.FirstName)
@LabelFor(model=>model.LastName)
@EditorFor(model=>model.LastName)
@Html.ValidationMessageFor(model=>model.LastName)
@LabelFor(model=>model.DateOfBirth)
@EditorFor(model=>model.DateOfBirth)
@Html.ValidationMessageFor(model=>model.DateOfBirth)
@LabelFor(model=>model.Gender)
@DropDownListFor(model=>model.Gender,新选择列表(Enum.GetValues(typeof(TestApp.Models.Gender)))
@Html.ValidationMessageFor(model=>model.Gender)
@Html.Partial(“\u PartialRegisterStudent”)
}
@ActionLink(“返回列表”、“索引”)
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
部分视图“\u PartialRegisterStudent.cshtml
@model TestApp.Models.RegisterModel
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<fieldset>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</li>
<li>
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
</li>
</ol>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
@model TestApp.Models.RegisterModel
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@LabelFor(m=>m.UserName)
@Html.TextBoxFor(m=>m.UserName)
@LabelFor(m=>m.Password)
@Html.PasswordFor(m=>m.Password)
@LabelFor(m=>m.ConfirmPassword)
@Html.PasswordFor(m=>m.ConfirmPassword)
}
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
如果登录的用户不退出应用程序,创建具有教师角色的学生的最佳方法是什么?我考虑过使用继承(Parent-UserProfile,Child-Student)以及学生模型和用户配置文件模型之间的一对一关系,但无法确定如何使其工作。非常感谢代码示例
请注意,如果这篇文章有点长,请告诉我。谢谢。只要在“创建操作”中删除下面的一行,它就会起作用
WebSecurity.Login(model.UserName, model.Password);
非常感谢您的评论。我需要使用这个
WebSecurity.CreateUserAndAccount(model.UserName,model.Password,new{StudentId=student.Id})
上面的代码行只是创建一个新的UserProfile和Membership类对象,每次创建一个新的学生。我相信,我非常需要这行代码来授权登录。只需删除我发布的一行代码。我不确定Websecurity.login
方法。我会尝试让你知道。我知道,这是因为你的创建操作方法中有“WebSecurity.Login”,这就是它将教师角色用户踢出的原因。林,如果你的建议有效,我肯定会将你的帖子标记为答案。
WebSecurity.Login(model.UserName, model.Password);