自定义 UserProfile 类 SimpleMembershipProvider

Posted

技术标签:

【中文标题】自定义 UserProfile 类 SimpleMembershipProvider【英文标题】:Customizing UserProfile class SimpleMembershipProvider 【发布时间】:2013-12-16 00:20:25 【问题描述】:

我是 MVC 新手,我正在尝试构建一个小型测试应用程序,以清楚了解 SimpleMembershipProvider 在 MVC 4 中的工作原理。我创建了两个角色 - 学生和教师。我只有一个分配了教师角色的用户(在 Configuration.cs 中硬编码),他将创建学生,在创建新学生时,教师还将为该学生生成用户 ID 和密码。然后,新创建的学生将使用教师创建的用户名和密码登录应用程序并执行某些任务。 问题是每当具有教师角色的用户创建一个学生时,当前登录的具有教师角色的用户会被注销,而新创建的学生会被登录。我所做的是,我没有为用户 ID 保留任何字段和学生模型中的密码。在创建新学生时,我已使用部分视图绑定RegisterModel(来自 AccountModels)来生成用户名和密码字段。我在 UserProfile 模型中保留了 StudentID。 这是我的代码,如下所示,为了更清楚起见。

学生模型

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; 

用户档案模型

    public class UserProfile
    
        public int UserId  get; set; 
        public string UserName  get; set; 
        public int StudentId  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")

部分视图“_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")

在没有登录用户退出应用程序的情况下创建具有教师角色的学生的最佳方法是什么?我考虑过使用继承(Parent - UserProfile,Child-Student)以及学生模型和用户配置文件模型之间的一对一关系,但无法弄清楚如何使其工作。代码示例将不胜感激!

附:如果这篇文章有点长,请原谅我。谢谢。

【问题讨论】:

【参考方案1】:

只需在 Create Action 中删除以下行,它应该可以工作。

WebSecurity.Login(model.UserName, model.Password);

【讨论】:

非常感谢您的评论。我需要用这个WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new StudentId = student.Id );上面这行代码只是创建一个新的UserProfile和Membership类的对象,每次创建一个新学生。我相信,我非常需要这行代码来授权登录。跨度> 像我发的一样删掉一行。 我不确定Websecurity.login 方法。我会尽力让你知道。 我知道,这是因为您的 create Action 方法中有“WebSecurity.Login”,这就是它踢出教师角色用户的原因。 林,如果你的建议有效,我一定会把你的帖子标记为答案。

以上是关于自定义 UserProfile 类 SimpleMembershipProvider的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVC4 的 UserProfile 中创建自定义附加字段

Python web开发——自定义userprofile(用户描述)

西游之路——python全栈——自定义用户认证

django 自定义用户表替换系统默认表

在 Django 中扩展用户对象:用户模型继承还是使用 UserProfile?

/admin/ 处的 FieldError - 为 UserProfile 指定了未知字段 (add_on)