为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET Core 会话状态

ASP.NET Core 会话状态

C#
宝慕林4294392 2022-07-23 16:24:41
我有一个控制器,其中有几种方法。在登录方法中,我启动一个HttpContext.Session.SetInt32("ID"),如果登录成功。此 ID 是登录用户的 ID。我在许多其他方法中使用此 ID 进行更多计算和查询。在每种方法中,我都必须声明一个变量, ?int userId = HttpContext.Session.GetINT32("ID")以便在该方法中使用该变量。如何在不使用语句的情况下以可以在其他 Action 方法中使用它的方式全局声明它HttpContext.Session.GetInt32。我只是想使用 DRY 原则,让我的代码更干净。任何帮助,将不胜感激?
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

public class HomeController : Controller

{

    private readonly DataContext _context;

    private readonly IRepository _repo;


    public HomeController(DataContext context, IRepository repo)

    {

        this._context = context;

        this._repo = repo;

    }


    public int GetUserId()

    {

       return (int)HttpContext.Session.GetInt32("ID");

    }


查看完整回答
反对 回复 2022-07-23
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

在 ASP.NET Core 中管理会话(全局)的最佳方法是:


1)。添加静态类 SessionExtensions.cs

       public static class SessionExtensions

        {

            public static void SetObject(this ISession session, string key, object value)

            {

                session.SetString(key, JsonConvert.SerializeObject(value));

            }


            public static T GetObject<T>(this ISession session, string key)

            {

                var value = session.GetString(key);

                return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);

            }


            public static void SetBoolean(this ISession session, string key, bool value)

            {

                session.Set(key, BitConverter.GetBytes(value));

            }


            public static bool? GetBoolean(this ISession session, string key)

            {

                var data = session.Get(key);

                if (data == null)

                {

                    return null;

                }

                return BitConverter.ToBoolean(data, 0);

            }


            public static void SetDouble(this ISession session, string key, double value)

            {

                session.Set(key, BitConverter.GetBytes(value));

            }


            public static double? GetDouble(this ISession session, string key)

            {

                var data = session.Get(key);

                if (data == null)

                {

                    return null;

                }

                return BitConverter.ToDouble(data, 0);

            }

        }

2)。添加静态类 UserSession.cs

    public static class UserSession

        {

            private static IHttpContextAccessor _accessor;

            public static void Configure(IHttpContextAccessor httpContextAccessor)

            {

                _accessor = httpContextAccessor;

            }


            public static HttpContext HttpContext => _accessor.HttpContext;



            public static Guid UserId

            {

                get

                {

                    if (HttpContext.Session.GetString("UserId") == null || Guid.Parse(HttpContext.Session.GetString("UserId")) == Guid.Empty)

                        return Guid.Empty;

                    else

                        return Guid.Parse(Convert.ToString(HttpContext.Session.GetString("UserId")));

                }

                set

                {

                    HttpContext.Session.SetString("UserId", Convert.ToString(value));

                }

            }



            public static byte[] ProfileImage

            {

                get

                {

                    if (HttpContext.Session.GetObject<byte[]>("ProfileImage") == null)

                        return null;

                    else

                        return HttpContext.Session.GetObject<byte[]>("ProfileImage");

                }

                set

                {

                    HttpContext.Session.SetObject("ProfileImage", value);

                }

            }


            public static string JwtToken

            {

                get

                {

                    if (HttpContext.Session.GetString("JwtToken") == null)

                        return null;

                    else

                        return HttpContext.Session.GetString("JwtToken");

                }

                set

                {

                    HttpContext.Session.SetString("JwtToken", value);

                }

            }


            public static string FirstName

            {

                get

                {

                    if (HttpContext.Session.GetString("FirstName") == null)

                        return null;

                    else

                        return HttpContext.Session.GetString("FirstName");

                }

                set

                {

                    HttpContext.Session.SetString("FirstName", value);

                }

            }


            public static string LastName

            {

                get

                {

                    if (HttpContext.Session.GetString("LastName") == null)

                        return null;

                    else

                        return HttpContext.Session.GetString("LastName");

                }

                set

                {

                    HttpContext.Session.SetString("LastName", value);

                }

            }


            public static string FullName { get { return (!string.IsNullOrWhiteSpace(FirstName) ? FirstName : string.Empty) + " " + (!string.IsNullOrWhiteSpace(LastName) ? LastName : string.Empty); } }



            public static string Email

            {

                get

                {

                    if (HttpContext.Session.GetString("Email") == null)

                        return null;

                    else

                        return HttpContext.Session.GetString("Email");

                }

                set

                {

                    HttpContext.Session.SetString("Email", value);

                }

            }

        }

3).在startup.cs中添加这个

     public void ConfigureServices(IServiceCollection services)

    {

     services.AddSession(options =>

                {

                    options.IdleTimeout = TimeSpan.FromMinutes(60);//You can set Time   

                });


            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    {

        app.UseSession();


        UserSession.Configure(app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());

    }

4)。瞧。完毕

--------------------

How to use :


Set session (Ex:Set session for UserId) > UserSession.UserId = 1;

Get session (int id = UserSession.UserId)


查看完整回答
反对 回复 2022-07-23
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

如果您使用的是Identity,那么您可以像这样获取用户 ID:

User.Identity.GetUserId(); // <-- this is inside controller


查看完整回答
反对 回复 2022-07-23
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号