Asp.net mvc 自定义UserProfile类SimpleMembershipProvider

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中硬编码),他将创建学生,并在创建新学生时,教师还将为该学生生成用户名和密码。新创建的学生将使用教师创建的用户名和密码登录到应用程序,并执行某些任务。 问题是,每当具有教师角色的用户创建一个学生时,具有教师角色的当前登录用户就会注销,而新创建的学生就会登录。我所做

我是MVC新手,我正在尝试构建一个小的测试应用程序,以便清楚地了解SimpleMembershipProvider在MVC4中是如何工作的。我创造了两个角色——学生和教师。我只有一个用户分配了教师角色(在Configuration.cs中硬编码),他将创建学生,并在创建新学生时,教师还将为该学生生成用户名和密码。新创建的学生将使用教师创建的用户名和密码登录到应用程序,并执行某些任务。 问题是,每当具有教师角色的用户创建一个学生时,具有教师角色的当前登录用户就会注销,而新创建的学生就会登录。我所做的是,我没有在学生模型中保留任何userid和password字段。我使用了一个绑定到注册模型的局部视图(来自AccountModels),在创建新学生时生成用户名和密码字段。我将StudentID保存在UserProfile模型中。 这是我的代码,如下所示,以进一步澄清

学生模型

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);