我有一个MVC3应用程序,我想让用户能够设置用户登录时启用的首选项。
我真的不知道从哪里开始,我真的很感激被指向正确的方向。我确实尝试过对会员类的一些更改,但现在我认为这可能不是最好的方法。
答案 0 :(得分:1)
一旦唯一标识用户,您就可以在数据库中执行此操作(听起来您可能至少使用一个开箱即用的成员资格提供程序)。在这种情况下,您可能希望实施自己的会员提供商。
您必须做一些工作才能开始实施自己的提供商。如果这是您唯一的要求,您可以通过编写自己的类来避免它,该类以您选择的格式返回设置
public static class UserSettings
{
public static string GetSettings(IPrincipal user)
{
if(user.Identity.IsAuthenticated)
{
// dip into database using user.Identity.Name property
return "string with user settings";
// this also assumes user.Identity.Name is uniquely able
// to identify a user in your database!
}
return string.Empty;
}
}
或者,如果信息完全无关紧要,也许您可以实现用户设置的cookie表示。当然,这包含了使用cookie的所有注意事项,但您可以避免将信息存储在数据库中
您拥有HttpContext
的任何地方都可以获取设置值,如下所示:
if(HttpContext.Current != null)
{
string userSettings = HttpRequest.Current.Request.Cookies["NameOfCookie"];
}
答案 1 :(得分:1)
您可以使用FormsAuthentication cookie存储您的用户信息,并避免一直访问数据库。该cookie已加密,您存储的任何信息都与用户会话本身一样安全。 Cookie的唯一问题是它们的最大大小为4K,因此,如果您的用户信息很大,那么您可能会遇到问题。当我使用cookie方法时,我将我的用户数据存储为JSON,然后在每个页面请求上反序列化该JSON。这是我的登录控制器逻辑(我使用SimpleMembership,但方法是相同的:
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, model.RememberMe))
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null)
{
var user = _userLogic.GetItem(model.UserName);
if (user != null && user.IsActive)
{
var newAuthTicket = new FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, authTicket.Expiration, authTicket.IsPersistent, JsonConvert.SerializeObject(user));
var newCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newAuthTicket))
{
Expires = authCookie.Expires
};
Response.Cookies.Add(newCookie);
return RedirectToLocal(returnUrl);
}
WebSecurity.Logout();
ModelState.AddModelError("UserName", "This account has been deactivated.");
return View(model);
}
}
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
请注意newAuthTicket的创建以及用户实例如何作为JSON传递给它。在那之后,我所要做的就是在我的基本控制器的OnAuthorization方法中使用这个用户对象:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null)
{
var principal = new CustomPrincipal(HttpContext.User.Identity)
{
CurrentUserInfo = JsonConvert.DeserializeObject<User>(authTicket.UserData)
};
HttpContext.User = principal;
AppUser = principal.CurrentUserInfo;
ViewBag.AppUser = AppUser;
}
}
base.OnAuthorization(filterContext);
}
答案 2 :(得分:-1)
在数据库中创建一个新表。