2016-05-11 3 views
2

私は、RC1ビットと外部(Google)認証を使用し、Identity.EntityFrameworkを使用していません。ASP.NET 5 Identity 3ユーザーがしばらくしてからサインアウトしました

ログイン時に「Remember me」フラグを設定します。

ログインしたユーザーはブラウザの再起動後も存続します(Cookieの有効期限は14日間です)。サインアウトにページリードをリフレッシュ

しかし、非アクティブのいくつかの時間(約15分)の後、関係なく、ブラウザ/サイトを再起動しなかったか、ログが言う:

info: Microsoft.AspNet.Authentication.Cookies.CookieAuthenticationMiddleware: 
    AuthenticationScheme: Microsoft.AspNet.Identity.Application signed out. 
    AuthenticationScheme: Microsoft.AspNet.Identity.External signed out. 
    AuthenticationScheme: Microsoft.AspNet.Identity.TwoFactorUserId signed out. 

これはの「セッション」のように見えます以前のASPでしたが、ここではセッションを使用していません。

これは私のローカル開発者のマシン、無IIS、5000ポートへの直接ケストレル接続され、ユーザがサインアウトすることを余儀なくなぜこれがdata-protection problem

ではないでしょうか?

更新は:私のStartup.csファイル:

public void ConfigureServices(IServiceCollection services) 
{ 
    .... 
    var identityBuilder = services 
     .AddIdentity<User, UserRole>(options => 
     { 
      options.User.AllowedUserNameCharacters = null; 
      options.Cookies.ApplicationCookie.LoginPath = "/user/login"; 
      options.Cookies.ApplicationCookie.LogoutPath = "/user/logout"; 
     }); 
    identityBuilder.Services 
     .AddScoped<IUserStore<User>, SportCmsDb>(serviceProvider => serviceProvider.GetService<SportCmsDb>()) 
     .AddScoped<IRoleStore<UserRole>, SportCmsDb>(serviceProvider => serviceProvider.GetService<SportCmsDb>()); 
    identityBuilder 
     .AddDefaultTokenProviders(); 
    .... 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    .... 
    app.UseIdentity(); 
    app.UseGoogleAuthentication(options => 
    { 
     options.ClientId = Configuration["OAuth:Google:ClientId"]; 
     options.ClientSecret = Configuration["OAuth:Google:Secret"]; 
    }); 
    .... 

SportCmsDbDbContextであり、またIUserStore<User>IUserLoginStore<User>IUserEmailStore<User>IRoleStore<UserRole>IUserClaimStore<User>

を実装アップデート2

私はDETAを有効に(デバッグ)ロギングを行い、ユーザーがサインアウトしたときに、これより前に私のIUserStore<User>.FindByIdAsyncが呼び出されたことがわかりました。実際の/既存のユーザーIDと関数は、nullでない正しいユーザーを戻します。すべてが良いようです。しかし、私からロードされたUserは "拒絶"され、サインアウトが強制されました。理由/場所を明らかにする追加のログメッセージはありません。

+0

ConfigureServicesにservices.AddIdentityへの呼び出しを含めることができますか、それとも完全に削除しましたか? Startup.Configureメソッドでまだ 'app.UseIdentity();'を使用していますか? –

+0

'Startup.cs'の部分で私のポストを更新しました – Dmitry

答えて

6

うわー、私はそれを解決しました!

TL; DR

私は私のカスタムUserManager(別名SportCmsDb)にIUserSecurityStampStore<User>を実装する必要があります。 default instance of IdentityCookieOptionsと(Startup.csConfigureServices方法で)AddIdentityコールIdentityOptions are configured

詳細

IdentityCookieOptionsのコンストラクタでは、(CookieAuthenticationOptionsの)ApplicationCookieのインスタンスが、ハンドラCookieAuthenticationEvents.OnValidatePrincipalset to SecurityStampValidator.ValidatePrincipalAsync静的メソッドで作成されます。 (Startup.csConfigure方法で)UseIdentity通話中

CookieAuthenticationMiddlewareconfigured with IdentityOptions.Cookies.ApplicationCookie optionsあります。

CookieAuthenticationHandlerCookieAuthenticationMiddlewareで作成)は、HandleAuthenticateAsyncの方法でチケットをCookieから読み取り、Options.Events.ValidatePrincipalハンドラを呼び出して検証します。

効果的には、SecurityStampValidator.ValidatePrincipalAsyncが呼び出されます。このメソッドは、Cookieが発行された後にがチェックされ(30 min by default)、ISecurityStampValidator.validateAsync(81〜82行目)を呼び出します。

ISecurityStampValidatorのデフォルト実装はSecurityStampValidator<TUser>です。 SignInManager<TUser>.ValidateSecurityStampAsyncを呼び出し、nullが返された場合、プリンシパルを拒否し、ユーザーにサインアウトを強制します(30〜40行目)。そのValidateSecurityStampAsync method試行中

SignInManager<TUser>Userからセキュリティスタンプを読んで、それができない(UserManager<User>はこのインタフェースをサポートしていない場合)またはスタンプ(クッキーに)1を保存一致しない場合はnullを返します。

私のカスタムUserManagerIUserSecurityStampStore<User>を実装していません。ビンゴ。

+0

こんにちは、カスタムのUserStoreに' IUserSecurityStampStore'インターフェースを実装し、スタンプをユーザ( 'SetSecurityStampAsync')に保存して返しましたが(' GetSecurityStampAsync')、Setメソッド決して呼ばれたことはありませんか? asp.netコードの 'ValidateSecurityStampAsync'メソッドで、私は' SecurityStampClaimType'という名前でクレームを取得しているのを見ましたか?誰がその主張を設定する責任がありますか?私?私の場合、私はカスタムのUserManagerやSignInManagerを持っていませんが、ストアはカスタムでしかありません。そこにはユーザを取得するだけで、ユーザを作成することはありません。 –

+1

'SetSecurityStampAsync'を手動で呼び出す必要があるのは、ユーザーがリロインする必要があるときだけです(例えば、管理ページからロール/権限を変更した後)。クレーム 'SecurityStampClaimType'が(内部で)(ユーザーIDと名前の主張で)設定されているので、これについて心配しないでください。しかし、最初のセキュリティスタンプ値を持つべきです - 'GetSecurityStampAsync'はnullを返すべきではありません。 – Dmitry

+0

オハイオ州、私はすべてが正しいと思ったが、成功しなかった:(私はクレームにスタンプの値を入れたが、 'GetSecurityStampAsync'(私がクレームに入れたものと同じ値を返す)は決して呼び出されなかった..テストを待っている30分厳しいです: –

関連する問題