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