使用表单身份validation获取当前用户ID(而不是名称)?
题:
我正在玩表单身份validation和我自己的自定义成员资格提供程序。
从我看到的,我可以通过以下方式获得当前的FormsIdentity:
System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity) System.Web.HttpContext.Current.User.Identity;
我可以让当前的会员用户这样做:
var UserFromDb = System.Web.Security.Membership.GetUser();
然后我可以通过这样做获得用户ID:
var MyUserId = UserFromDb.ProviderUserKey;
我觉得有趣的是,当我调用Membership.GetUser()时,它会在成员资格提供程序中调用此方法
public override MembershipUser GetUser(string username, bool userIsOnline)
其中查找数据库中的用户信息。
所以我认为.NET框架内部就是这样
GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever);
它根据USERNAME从数据库中获取用户信息。 我发现这令人不安,首先是因为当我必须查找整个用户只是为了获得用户ID时,它对性能有害。
其次,令人不安的是我必须查找用户ID,因为这不是我所期望的。
第三,它令人不安,因为用户名可以在程序过程中更改,并且让用户必须注销并登录才能这样做是无稽之谈。
现在,对我来说,这个设计听起来像废话。
但话说回来,微软还使用应用程序名称,组名和用户名作为主键,这也没有多大意义。
所以我的问题在这里:
没有数据库查找的方法来获取用户ID?
或者整个会员提供者的想法是如此被设计破坏?
如果它坏了:
我看到FormsIdentity有一个名为userdata的字符串属性。 如果是这样,我如何使用ASP.NET来保存用户ID?
是的,可以从这里找到解决方法。
可以在Auth cookie-Ticket UserData中设置UserId。
public class UserData { public string FirstName { get; set; } public UserData() { FirstName = "Unknown"; } } // End Class UserData public void SignIn(string userName, bool createPersistentCookie) { if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName"); UserData userData = new UserData(); SetAuthCookie(userName, createPersistentCookie, userData); //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); } public void SetAuthCookie(string userName, bool createPersistentCookie, UserData userData) { HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie); FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration ,ticket.IsPersistent, userData.ToJSON(), ticket.CookiePath ); string encTicket = FormsAuthentication.Encrypt(newTicket); cookie.Value = encTicket; System.Web.HttpContext.Current.Response.Cookies.Add(cookie); } // End Sub SetAuthCookie
另一种可能性是使用UserId.ToString()作为“名称”。
- 如何通过ASP.NET中的另一个下拉列表过滤下拉列表值,c#
- 为什么Request.Form.ToString()的返回值与NameValueCollection.ToString()的结果不同
- 使用Url.Link在Web API中生成HTTPS链接
- 如何防止用户生成的Sql查询上的Sql注入
- 加密app.config后无法识别的属性’configProtectionProvider’
- 未定义或导入预定义类型“System.Object”.net 4.6
- ASP.NET gridview行onclick
- 使用System.ComponentModel.BrowseableAttribute赢得7 IIS 7.5奇怪的行为
- HTML5电子邮件输入无法分配ID和RUNAT =“服务器”ASP.NET 4