如何获取登录用户数据(以安全的方式)

时间:2018-07-09 08:12:55

标签: c# asp.net entity-framework authentication asp.net-identity

我正在使用ASP.NET MVC实体框架。 目前,在我的应用程序中,我可以登录并检索一些数据,但是我不确定执行此操作的方法是否安全。

以下是我的应用程序的工作方式:

当前用户登录时,我利用以下内容将用户名存储在cookie中:

FormsAuthentication.SetAuthCookie(user.Username, true);

然后我有一个RoleProvider类,其中包含以下方法,该方法返回具有用户角色的字符串数组:

public override string[] GetRolesForUser(string username)
    {
        List<string> rolesList = new List<string>();

        string role = CurrentlyLoggedInUser.User.Role.Name;

        rolesList.Add(role);

        string[] rolesArray = rolesList.ToArray();

        return rolesArray;
    }

然后我有下面的类,用于存储当前登录用户的数据:

public class CurrentlyLoggedInUser
{
    private const string UserKey = "MyWebApp.Infrastructure.UserKey";

    public static User User
    {
        get
        {
            MyDBEntities db = new MyDBEntities();

            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                return null;
            }
            var user = HttpContext.Current.Items[UserKey] as User; //we set the 

            if (user == null)
            {
                user = db.Users.FirstOrDefault(x => x.Username == HttpContext.Current.User.Identity.Name);

                if (user == null)
                {
                    return null;
                }
                HttpContext.Current.Items[UserKey] = user;
            }
            return user; //Then we return the user object
        }
    }
}

然后,每当需要查询数据库以查找用户的任何相关数据时,我都会按以下方式检索用户ID:

int id = CurrentlyLoggedInUser.User.UserId;

现在我可以使用此ID进行查询了。

完成后,我注销并拨打以下电话:

FormsAuthentication.SignOut();

这是否被推荐并足够安全?

1 个答案:

答案 0 :(得分:0)

考虑要求https保护您的登录表单,请不要忘记MVC控制器和/或操作上的Authorize属性(或最好将Authorize属性设置为全局过滤器)以及足够的基本级别。 @ Chad-Nedzlek并非绝对正确,FormsAuthentication涉及到您的身份验证Cookie加密,因此任何人冒充他人都不容易。但是在实现自定义登录时必须注意防止暴力破解:请考虑密码有效期限制,所需的复杂性等。
并且如果您正在考虑将来的可扩展性,Web,移动应用程序和API的SSO或容易使用外部(Facebook,Google等)登录名的可能性,请考虑切换到OpenId Connect。