【问题标题】:saving session data once authenticated .net.net 认证后保存会话数据
【发布时间】:2014-04-09 01:38:01
【问题描述】:

所以我正在使用 c#、MVC 和 sqlexpress 在 .NET 中构建一个 Web 应用程序。我希望用户能够登录,并根据他们所属的组,查看 UI 的某些部分。

我在我的数据库中为组和用户创建了表,使用 ADO.NET 向导从这些表中创建了模型以创建模型。

我添加了一个控制器,该控制器具有检查用户是否存在以及他的密码是否正确的方法。我的问题是如何存储用户通过“©正确”方式进行身份验证的信息?

目前,我只是在System.Web.Mvc.Controller 提供的会话变量中创建一个新对象。我创建了一个标志对象Session["Authenticated"] = true 并创建了另一个对象,该对象将信息(用户名、组从属关系等...)保存为Session["User"]

我偶然发现了描述实现您自己的会员提供程序(herehere)的文章,但我觉得我需要打破现有的密码安全和帐户控制类,以便在自定义成员资格提供程序。

自定义成员资格提供程序实现是否必要,或者会话中保存的数据是否足够好?

【问题讨论】:

  • 自定义会员提供者的想法是将现有的会员提供者与您自己的数据方案一起使用。您可以将成员资格/角色存储在 cookie 中并从那里检索。我建议不要使用会话变量。

标签: c# asp.net .net asp.net-mvc session


【解决方案1】:

如果您不想走会员提供者路线,更好的方法是查看表单身份验证 (http://msdn.microsoft.com/en-us/library/xdt4thhy(v=vs.100).aspx)。

【讨论】:

  • 根据我从该代码中得到的信息,FormsAuthentication.RedirectFromLoginPage(UserEmail.Text, Persist.Checked) 将用户信息保存在某处,但我仍然无法保存他所属的组。
【解决方案2】:

首先保存有关用户的角色和权限,并编写自定义操作过滤器,其中检查用户是否有权访问控制器方法,如果是,则继续,如果没有,则生成异常和响应消息。

当用户登录时,还获取当前用户角色和权限,并将其保存在自定义过滤器中的会话或按钮和选项卡上,从会话检查用户是否具有权限,如果用户有权限,则显示选项卡,否则隐藏它。 这是示例的链接
Action Filters
Filters Example Code Project

【讨论】:

    【解决方案3】:

    在 ASP.NET MVC 项目中实现身份验证和授权的最简单方法之一是使用内置表单身份验证模块。当您创建一个新的 ASP.NET MVC 项目时,它已经包含了您开始使用 Forms Auth 所需的所有内容。

    它所要做的就是创建特定的表 (5),您无需担心或跟踪代码中的每一个表。这一切都非常简单。您始终可以将 ASP.NET MVC 成员资格提供程序创建的用户映射到您自己的 UserMaster 表。

    接下来,您只需在 ActionMethod 或 Controller 或 global.asax 中标记[Authorize] 属性即可,一切就绪。

    代码很简单:

    用于登录:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
         if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, 
                                                    persistCookie: model.RememberMe))
            {
                ///rest of the logic
            }
     }
    

    下面还有一些有用的功能会派上用场:

    if(WebSecurity.UserExists(username)){ /// ur logic }
    //or
    WebSecurity.CreateUserAndAccount(username, password);
    //or
    System.Web.Security.Roles.AddUserToRole(username, UserRole);
    

    你猜怎么着,你不必担心在一些HttpModule 中设置一些标志或首先总是执行函数来查看会话用户是否存在,[Authorize] 属性会处理这些。

    使用自定义UserMaster映射

    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, 
                                               persistCookie: model.RememberMe))
    {
        try
        {
             try
             {
                 //below is my custom method IsValidUser with my own logic for 
                 // valid user
                 MembershipCore.IsValidUser(model.UserName);
                 if (MembershipCore.isFirstTimeLogin(model.UserName))
                 {
                        //Show License Screen in a window
                        return RedirectToAction("License");
    
                  }
                  //my custom method setting custom Session variables
                  MembershipCore.SetLoggedInUser(model.UserName);
              }
          }
    }
    

    【讨论】:

    • 当您说“您始终可以将 ASP.NET MVC 成员资格提供程序创建的用户映射到您自己的 UserMaster 表。”时,我不明白这部分内容,一个人会怎么做那个?
    • 手动。每当您使用WebSecurity 类创建新用户时,同时,在成功创建后,将用户添加到包含所有这些字段的 UserMaster 表中,firstLogin、Activated、LastLogin 等。每当用户登录时,在WebSecurity.Login 之后,还要验证用户的 UserMaster 字段。此外,使这两个手动过程原子化,即如果其中任何一个失败,则另一个也失败。
    • 所以你说你有一组单独的表 WebSecurity 使用并将这些表中的信息复制到我的表中,然后通过开箱即用的方法进行双重检查,然后另一个用于我的数据库。对我来说似乎有点迂回,我觉得必须有一个更简单的方法,没有那么多冗余。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2016-07-31
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多