gpt4 book ai didi

asp.net-mvc - 我可以在 ASP.NET MVC 应用程序中的哪里存储电子邮件和用户 ID,这样我就不必在每次请求时都检索它?

转载 作者:行者123 更新时间:2023-12-02 00:29:28 25 4
gpt4 key购买 nike

我正在编写一个 ASP.NET MVC 应用程序,并且使用带有默认 IPrincipal、IIDentity 等的表单例份验证。

在我的身份验证票证中,我将用户名存储在名称参数中。

但是,我遇到了这样的情况:对于每个请求,我的主布局不仅需要访问用户名,还需要访问用户的电子邮件和用户 ID。

我需要电子邮件,以便我可以为用户加载重力图标,用户名,以便我可以在顶部栏中有一个友好的显示名称,以及用户ID,以便我可以定义特定于该用户ID的某些链接(即/用户/编辑/2332)。

不仅存储用户名,还存储用户 ID 和电子邮件的最简洁方法是什么?

自定义主体/身份对象?缓存? session ?还有其他方法吗?

最佳答案

将自定义 IPrincipal 对象与您自己的 Cookie 管理结合使用。

我建议将自定义 IPrincipal 对象序列化为 JSON 并将 cookie.UserData 设置为序列化字符串。当 cookie 返回时,很容易反序列化。

编辑:自定义 IPrincipal 对象和身份验证 cookie 管理的示例

IPrincipal 对象(注意我正在使用 Json.NET 进行序列化)

public class SimplePrincipal : IPrincipal
{
private IIdentity _identity;

[JsonIgnore]
public IIdentity Identity
{
get { return _identity ?? (_identity = new GenericIdentity(Name)); }
}

public string Name { get; set; }
public int WebUserId { get; set; }
public string Email { get; set; }
public long FacebookUserId { get; set; }
public IEnumerable<string> Roles { get; set; }

public bool IsInRole(string role)
{
return Roles.Contains(role);
}

/// <summary>
/// Get's a JSON serialized string of a SimplePrincipal object
/// </summary>
public static string GetCookieUserData(SimplePrincipal principal)
{
return JsonConvert.SerializeObject(principal);
}

/// <summary>
/// Creates a SimplePrincipal object using a JSON string from the asp.net auth cookie
/// </summary>
public static SimplePrincipal CreatePrincipalFromCookieData(string userData)
{
return JsonConvert.DeserializeObject<SimplePrincipal>(userData);
}
}

登录方式

private void LoginUser(SimplePrincipal principal, bool isPersistent)
{
var userData = SimplePrincipal.GetCookieUserData(principal);

var authCookie = FormsAuthService.GetAuthCookie(principal.Name, userData, isPersistent);

Response.Cookies.Add(authCookie);
}

认证模块

public class AuthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthenticateRequest += Application_AuthenticateRequest;
}

private void Application_AuthenticateRequest(Object source, EventArgs e)
{
var application = (HttpApplication)source;
var context = application.Context;

// Get the authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = context.Request.Cookies[cookieName];
if (authCookie == null)
return;

var authTicket = FormsAuthentication.Decrypt(authCookie.Value);

context.User = SimplePrincipal.CreatePrincipalFromCookieData(authTicket.UserData);
}

public void Dispose()
{
//Don't do anything
}
}

在所有这些都正确连接之后,您可以简单地获取如下对象:

var principal = HttpContext.Current.User as SimplePrincipal

关于asp.net-mvc - 我可以在 ASP.NET MVC 应用程序中的哪里存储电子邮件和用户 ID,这样我就不必在每次请求时都检索它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com