首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用窗体身份验证的ASP.NET MVC上,将记录的用户信息存储在哪里?

在使用窗体身份验证的ASP.NET MVC上,将记录的用户信息存储在哪里?
EN

Stack Overflow用户
提问于 2009-12-01 02:08:04
回答 2查看 29.7K关注 0票数 23

我在我的应用程序上使用了ASP.NET MVC和表单身份验证。基本上,我使用FormsAuthentication.SetAuthCookie登录,使用FormsAuthentication.SignOut注销。

在HttpContext.Current.User.Identity中,我已经存储了用户名,但我需要有关登录用户的更多信息。我不想在会话中存储我的整个用户obj,因为它可能很大,并且包含的信息比我需要的要多得多。

您认为创建一个名为LoggedUserInfo的类,只包含我需要的属性,然后将其添加到会话variable中是个好主意吗?这是一种好的方法吗?

或者你有更好的主意吗?

EN

回答 2

Stack Overflow用户

发布于 2009-12-02 06:05:15

我实际上喜欢使用我在登录操作方法中设置的CustomPrincipal和CustomIdentity,例如

代码语言:javascript
复制
        if (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password) && _authService.IsValidLogin(username, password))
        {
            User objUser = _userService.GetUserByName(username);
            if (objUser != null)
            {
                //** Construct the userdata string
                string userData = objUser.RoleName + "|" + objUser.DistrictID + "|" + objUser.DistrictName + "|" + objUser.ID + "|" + objUser.DisplayName;
                HttpCookie authCookie = FormsAuthentication.GetAuthCookie(username, rememberMe.GetValueOrDefault());
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
                FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userData);
                authCookie.Value = FormsAuthentication.Encrypt(newTicket);
                Response.Cookies.Add(authCookie);
                return RedirectToAction("Index", "Absence");
            }
            else
            {
                return RedirectToAction("LogOn", "Account");
            }
        }
        else
        {
            return RedirectToAction("LogOn", "Account");
        }

然后,在自定义主体中,您可以使用访问传递给构造函数的特定信息的方法,如

代码语言:javascript
复制
((CustomIdentity)((CustomPrincipal)HttpContext.Current.User).Identity).DisplayName;

其中在CustomIdentity类中声明了DisplayName属性。

票数 4
EN

Stack Overflow用户

发布于 2009-12-01 02:33:41

将其存储在会话中的服务器端。

例如:

代码语言:javascript
复制
// Make this as light as possible and store only what you need
public class UserCedentials
{
    public string Username { get; set; }
    public string SomeOtherInfo { get; set; }
    // etc...
}

然后,当他们登录时,只需执行以下操作即可保存用户信息:

代码语言:javascript
复制
// Should make typesafe accessors for your session objects but you will
// get the point from this example
Session["UserCredentials"] = new UserCredentials()
    { Username = "SomeUserName", SomeOtherInfo = "SomeMoreData" };

然后,当你需要它的时候,获取它:

代码语言:javascript
复制
UserCredentials user = (UserCredentials)(Session["UserCredentials"]);

我已经写了几个关于在MVC中进行自定义授权的问题/答案:How to implement authorization checks in ASP.NET MVC based on Session data?

How does the Authorize tag work? - Asp.net Mvc

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1821412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档