2017-09-20 13 views
4

私はMVCコア(フレームワーク)アプリケーションを構築しました。 「私を覚えています」オプションをクリックすると、開発マシンではすべてがOKですが、サーバーマシンにデプロイした後、「remember me」は30分後にログインを維持しません。Asp.Net core "remember me"永続的なcookieがデプロイ後に動作しない

クッキーの有効期限が設定されているかどうかを確認しようとしましたが、サーバーマシンでもクッキーがうまく設定されているようです。 あなたは画像を以下に私のクッキーの詳細を見ることができます:

enter image description here

誰も私は、この問題を解決するために助けることができますか?お返事を事前に

感謝:)

EDIT:

Orhunで要求されているように、私は私のStartup.csコンテンツの下に追加します。

public partial class Startup 
{ 
    public SymmetricSecurityKey signingKey; 

    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     if (env.IsDevelopment()) 
     { 
      // For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709 
      builder.AddUserSecrets<Startup>(); 
     } 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 

     /////////////////////////// 
     // Custom Services - START 
     /////////////////////////// 

     string conn = CreateConnectionString(Configuration.GetConnectionString("TiesseWebConnection")); 
     services.AddScoped<System.Data.Entity.DbContext>((_) => new TiesseWeb.DAL.TiesseWebEntities(conn)); //Configuration["Data:DefaultConnection:ConnectionString"])); 


     // SESSION section 
     services.AddMemoryCache(); 
     services.AddDistributedMemoryCache(); 
     services.AddSession(); 

     services.AddSingleton<IConfiguration>(Configuration); // IConfiguration explicitly 

     // Add functionality to inject IOptions<T> (important for inject Config object) 
     services.AddOptions(); 


     // Add our Config object so it can be injected 
     services.Configure<Settings>(Configuration.GetSection("Settings")); 
     // Add our Config object so it can be injected 
     services.AddScoped<Settings>(); 

     services.AddScoped<Tiesse.Web.BL.TiesseWebManager>(); 

     /////////////////////////// 
     // Custom Services - END 
     /////////////////////////// 

     // Add framework services. 
     services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("TiesseWebConnection"))); 


     services.AddIdentity<ApplicationUser, ApplicationRole>(i => 
     { 
      i.SecurityStampValidationInterval = TimeSpan.FromDays(14); 
      //i.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(14); 
     }) 
     //services.AddIdentity<ApplicationUser, ApplicationRole>()//IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext, int>() 
      .AddDefaultTokenProviders(); 

     services.AddMvc().AddJsonOptions(jsonOptions => 
     { 
      jsonOptions.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
     }); ; 

     // Add application services. 
     services.AddTransient<IEmailSender, AuthMessageSender>(); 
     services.AddTransient<ISmsSender, AuthMessageSender>(); 

     // Adds Authorizations 
     services.AddAuthorization(options => 
     { 
      options.AddPolicy("Admin", policy => policy.RequireClaim("Admin")); 
      options.AddPolicy("Admin-Utenti", policy => policy.RequireClaim("Admin-Utenti")); 
      options.AddPolicy("Admin-Filiali", policy => policy.RequireClaim("Admin-Filiali")); 
      options.AddPolicy("Admin-Reparti", policy => policy.RequireClaim("Admin-Reparti")); 
      options.AddPolicy("GoogleDrive", policy => policy.RequireClaim("GoogleDrive")); 
      options.AddPolicy("GoogleDrive-Gestione", policy => policy.RequireClaim("GoogleDrive-Gestione")); 
      options.AddPolicy("GoogleDrive-Gestione-Struttura", policy => policy.RequireClaim("GoogleDrive-Gestione-Struttura")); 
      options.AddPolicy("GoogleDrive-Consultazione", policy => policy.RequireClaim("GoogleDrive-Consultazione")); 
      options.AddPolicy("Reports", policy => policy.RequireClaim("Reports")); 
      options.AddPolicy("Reports-Test", policy => policy.RequireClaim("Reports-Test")); 
     }); 
    } 

    // 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) 
    { 
     // Custom settings 
     app.UseSession(); 

     //// configures Bearer token Authentication 
     //ConfigureAuth(app); 
     /////////////////// 


     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

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

     app.UseStaticFiles(); 

     app.UseIdentity(); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      //CookieName = "MyWebCookie", 
      //CookieDomain = "http://devweb01:81",  // uncomment when deploy 
      CookieHttpOnly = true, 
      CookieSecure = CookieSecurePolicy.Always, 
      ExpireTimeSpan = TimeSpan.FromDays(30), 
      SlidingExpiration = true, 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true 
      //AuthenticationScheme = "MyeWebCookie" 
     }); 

     app.UseGoogleAuthentication(new GoogleOptions() 
     { 
      // following Goggle Secrets data have been hardcoded because Configuration with Secrets.json works only in development environment 
      ClientId = "XXXXXXX....", 
      ClientSecret = "XXXXXXX....", 
      AutomaticAuthenticate = true 
      //SignInScheme = "MyWebCookie" 
     }); 

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

    #region Methods 

    public static string CreateConnectionString(string providerConnectionString) 
    { 
     var entityBuilder = new EntityConnectionStringBuilder(); 

     // use your ADO.NET connection string 
     entityBuilder.ProviderConnectionString = providerConnectionString; 

     entityBuilder.Provider = "System.Data.SqlClient"; 

     // Set the Metadata location. 
     entityBuilder.Metadata = @"res://*/TiesseWebDB.csdl|res://*/TiesseWebDB.ssdl|res://*/TiesseWebDB.msl"; 

     return entityBuilder.ConnectionString; 
    } 

    #endregion 
} 
+0

あなたのStartup.csファイルを共有できますか? – Orhun

+0

「CookieDomain」のコメントを外すと問題が解決したと思いますか?私はこの問題を解決しようとしている私の頭脳をラックに入れました... – dantey89

+0

こんにちはdantey89、現時点で私は問題を解決しませんでした。私は2つのサーバーにWebアプリケーションをデプロイしたので、Webサーバーのマシンに関連する問題だと思っています。あなたは解決策を見つけましたか?助言がありますか?ありがとうございました – Badozvora

答えて

1

私は同じ問題に直面していました。私は長い間それを解決することができませんでした。しかし数日前、私は解決策を見つけました。コメントで述べたように、問題はマシンキーです。理由は分かりませんが、アプリケーションは再起動されるたびに新しいマシンキーを生成します。だから問題を解決する方法は、アプリケーションが定数キーを使用するように強制することです。これを行うには、起動時にこのようなコードを追加する必要があります:あなたはあなたのマシンのキーを含むXMLを見つけるでしょう

 public void ConfigureServices(IServiceCollection services) 
     { 

      var environment = services.BuildServiceProvider().GetRequiredService<IHostingEnvironment>(); 


      services.AddDataProtection() 
        .SetApplicationName($"my-app-{environment.EnvironmentName}") 
        .PersistKeysToFileSystem(new DirectoryInfo([email protected]"{environment.ContentRootPath}\keys")); 

      ... 

     } 

「キー」フォルダ内のアプリケーションの起動後。詳細を見つけることができますhere

+0

こんにちはdantey89、それはあなたの指示に従って私の問題を解決し、あなたが投稿したリンクを幻想的です。 たくさんのveeeeryありがとう;) – Badozvora

+0

それはあなたのためにうれしい! – dantey89

関連する問題