gpt4 book ai didi

c# - 使用 Azure 中的 ASP.NET Core 将用户 session 保存在 Redis 中

转载 作者:IT王子 更新时间:2023-10-29 05:59:50 25 4
gpt4 key购买 nike

我正在使用 Redis 缓存来保存项目中的一些内容。

我正在使用 Azure (WebApp),当我在预生产环境与生产环境之间进行交换时,用户 session 会丢失,他需要在我的网页中重新登录。

我正在使用 Identity 3.0 和 UseCookieAuthentication。我想将“ session ”存储在 Redis 中,以便在进行交换时解决我的问题。

我没有找到相关信息,有什么想法吗?谢谢

Startup.cs代码ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{

// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);

// Registers MongoDB conventions for ignoring default and blank fields
// NOTE: if you have registered default conventions elsewhere, probably don't need to do this
//RegisterClassMap<ApplicationUser, IdentityRole, ObjectId>.Init();

AutoMapperWebConfiguration.Configure();

services.AddSingleton<ApplicationDbContext>();

// Add Mongo Identity services to the services container.
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
// configure identity options
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonLetterOrDigit = false;
o.Password.RequiredLength = 6;
o.User.RequireUniqueEmail = true;
o.Cookies.ApplicationCookie.CookieSecure = CookieSecureOption.SameAsRequest;
o.Cookies.ApplicationCookie.CookieName = "MyCookie";
})
.AddMongoStores<ApplicationDbContext, ApplicationUser, IdentityRole>()
.AddDefaultTokenProviders();

services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(60);
options.CookieName = "MyCookie";
});

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

services.AddLocalization(options => options.ResourcesPath = "Resources");

// Caching This will add the Redis implementation of IDistributedCache
services.AddRedisCache();

services.Configure<RedisCacheOptions>(options =>
{
options.Configuration = Configuration["RedisConnection"];
});




services.AddCaching();

// Add MVC services to the services container.
services.AddMvc(options =>
{
options.CacheProfiles.Add("OneDay",
new CacheProfile()
{
Duration = 86400,
Location = ResponseCacheLocation.Any
});

options.CacheProfiles.Add("OneMinute",
new CacheProfile()
{
Duration = 60,
Location = ResponseCacheLocation.Any
});

})
.AddViewLocalization(options => options.ResourcesPath = "Resources")
.AddDataAnnotationsLocalization();



services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));



}

Startup.cs代码

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

app.UseApplicationInsightsRequestTelemetry();

if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");

}

app.UseSession();

app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());

app.UseApplicationInsightsExceptionTelemetry();

app.UseStaticFiles();

app.UseIdentity();


app.UseCookieAuthentication(options =>
{
options.AutomaticAuthenticate = true;
options.LoginPath = new PathString("/Account/Login");
options.AutomaticChallenge = true;
});

var requestLocalizationOptions = new RequestLocalizationOptions
{
// Set options here to change middleware behavior
SupportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("es-ES")
},
SupportedUICultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("es-ES")

},
RequestCultureProviders = new List<IRequestCultureProvider>
{
new CookieRequestCultureProvider
{
CookieName = "_cultureLocalization"
},
new QueryStringRequestCultureProvider(),
new AcceptLanguageHeaderRequestCultureProvider
{

}

}
};

app.UseRequestLocalization(requestLocalizationOptions, defaultRequestCulture: new RequestCulture("en-US"));

app.UseFacebookAuthentication(options =>
{
options.AppId = "*****";
options.AppSecret = "****";
});

app.UseGoogleAuthentication(options =>
{
options.ClientId = "*****";
options.ClientSecret = "***";
});



app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
name: "view",
template: "{customName}/{id}",
defaults: new { controller = "View", action = "Index" });

});

}

最佳答案

session 未链接到身份验证,您尝试以错误的方式解决它。

所有表单例份验证票证和 cookie 均使用数据保护层进行加密和签名。您遇到的问题是由于未保存加密 key 以及应用程序相互隔离造成的。

为了解决这个问题,您必须共享加密 key 并在代码中设置应用程序名称。老实说,我建议你不要这样做。预制作不是实时服务,您不应该能够同时对两者进行身份验证。

如果您觉得必须这样做,那么您需要共享加密 key 环,并设置固定的应用程序名称。您可以通过共享文件夹或将它们存储在共享位置(例如 SQL 或 Azure 存储)来共享 key 。为此,您必须通过实现 IXmlRepository 来编写自己的 key 环提供程序。 。共享 key 后,您可以使用 SetApplicationName 设置固定的应用程序标识符在数据保护配置期间。

关于c# - 使用 Azure 中的 ASP.NET Core 将用户 session 保存在 Redis 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36474580/

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