Ste*_*ger 5 c# asp.net asp.net-mvc forms-authentication asp.net-membership
题:
我正在玩表单身份验证和我自己的自定义成员资格提供程序.
从我看到的,我可以通过以下方式获得当前的FormsIdentity:
System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity)
System.Web.HttpContext.Current.User.Identity;
Run Code Online (Sandbox Code Playgroud)
我可以让当前的会员用户这样做:
var UserFromDb = System.Web.Security.Membership.GetUser();
Run Code Online (Sandbox Code Playgroud)
然后我可以通过这样做获得用户ID:
var MyUserId = UserFromDb.ProviderUserKey;
Run Code Online (Sandbox Code Playgroud)
我觉得有趣的是,当我调用Membership.GetUser()时,它会在成员资格提供程序中调用此方法
public override MembershipUser GetUser(string username, bool userIsOnline)
Run Code Online (Sandbox Code Playgroud)
其中查找数据库中的用户信息.
所以我认为.NET框架内部就是这样
GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever);
Run Code Online (Sandbox Code Playgroud)
它根据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
Run Code Online (Sandbox Code Playgroud)
另一种可能性是仅使用 UserId.ToString() 作为“名称”。
| 归档时间: |
|
| 查看次数: |
21919 次 |
| 最近记录: |