我使用的aspx和c#的设置身份验证cookie进行登录。
FormsAuthentication.SetAuthCookie(UserName, True)
我想存储在相同的cookie的更多信息。 我可以添加值到这个身份验证Cookie或做我必须使用第二HTTP cookie的?
基本上我寻找而去存储用户的Id
,所以我可能能够访问使用用户表行键数据库
谢谢,伊甸园
我使用的aspx和c#的设置身份验证cookie进行登录。
FormsAuthentication.SetAuthCookie(UserName, True)
我想存储在相同的cookie的更多信息。 我可以添加值到这个身份验证Cookie或做我必须使用第二HTTP cookie的?
基本上我寻找而去存储用户的Id
,所以我可能能够访问使用用户表行键数据库
谢谢,伊甸园
您可以将用户数据添加到的FormsAuthenticationTicket,然后生成自己的cookie的。
还有的在示例MSDN文档的FormsAuthenticationTicket 。
编辑
请注意,在创建时票,你需要设置超时时间,这在一般你会希望同在web.config中配置的值。 不幸的是,框架3.5或更早的版本, FormsAuthentication
类不公开揭露此超时。 有关解决方法,使用在响应于所描述的技术中的一种这样连接反馈项 。
UPDATE
连接反馈产品,就不再出现了,可悲。 希望你简要介绍一下技术是。
是的,这是一个遗憾微软已经抛弃的历史连接的项目。 IIRC,这两种技术他们建议是:
使用WebConfigurationManager读取相关的配置部分,并获得超时值。
创建使用Cookie FormsAuthentication.GetAuthCookie
,解密用FormsAuthentication.Decrypt
并检查产生FormsAuthenticationTicket
。
或升级到.NET 4.x的,那里是一个FormsAuthentication.Timeout
财产。
见这个问题的更多信息
只要是对你有用,你可以把任何你想要在身份验证cookie中。 这就是说,如果你把你应该敏感信息,至少是,加密,但我不推荐把敏感信息那里。 你可以这样做:
Forms.SetAuthCookie (UserName + "|" + UserId, true);
然后,当你需要的用户名或用户ID,它的存在。 只是加载cookie并解析出你需要的值。
同样, 我建议反对这样做,特别是因为我上面提供 。 这就是说,它是可能的。 你应该创建存取方法来提取数据退了出来:
public int CurrentUserId
{
get
{
int userId = 0;
if (HttpContext.Current.Request.IsAuthenticated)
{
userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]);
}
return userId;
}
}
public string CurrentUserName
{
get
{
string userName = string.Empty;
if (HttpContext.Current.Request.IsAuthenticated)
{
userName = HttpContext.Current.User.Identity.Name.Split('|')[0];
}
return userName;
}
}
是的,它是明智的使用“|” 把更多的信息。 如果微软有另一个重载方法
public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`
然后,我们的生活会容易得多,我们的代码将更加安全。
传递用户ID作为用户名PARAM。
FormsAuthentication.SetAuthCookie(userId, True)
你是如何保护您的身份验证票?
你可以存储在附加信息UserData
的财产FormsAuthenticationTicket
:
using Newtonsoft.Json;
using System.Web;
using System.Web.Security;
public class LoggedInUser
{
public string FirstName { get; set; } = null;
public bool IsAdmin { get; set; } = false;
}
public static class Authentication
{
static void SignIn(
HttpContextBase context,
string emailAddress,
bool rememberMe,
LoggedInUser user = null)
{
var cookie = FormsAuthentication.GetAuthCookie(
emailAddress.ToLower(),
rememberMe);
var oldTicket = FormsAuthentication.Decrypt(cookie.Value);
var newTicket = new FormsAuthenticationTicket(
oldTicket.Version,
oldTicket.Name,
oldTicket.IssueDate,
oldTicket.Expiration,
oldTicket.IsPersistent,
JsonConvert.SerializeObject(user ?? new LoggedInUser()));
cookie.Value = FormsAuthentication.Encrypt(newTicket);
context.Response.Cookies.Add(cookie);
}
static void SignOut(HttpContextBase context)
{
FormsAuthentication.SignOut();
}
static LoggedInUser GetLoggedInUser()
{
if (HttpContext.Current.User?.Identity?.Name != null && HttpContext.Current.User?.Identity is FormsIdentity identity)
return JsonConvert.DeserializeObject<LoggedInUser>(identity.Ticket.UserData);
return new LoggedInUser();
}
}
延伸阅读: https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/forms-authentication-configuration-and-advanced-topics-cs#step-4 -storing-附加用户数据内式票