2017-11-13 20 views
0

私はMVCでASP.NETアイデンティティを使用しており、彼のデバイスのそれぞれについてログインした各ユーザーにsessionId(GuId文字列)を設定しました。アイデアは、ユーザーがデバイスセッションを削除することができるということです。その後、そのデバイスは(dropboxとgoogleで行われるように)もうログインしなくなります。ASP.NETカスタムクレームのアイデンティティと検証

現在のところ、このsessionIdはASP.NET IDの要求として設定されているため、認証Cookieに渡されます。

私はサンプルとしてASP.NETアイデンティティを使用Authenricationするため

:app.UseCookieAuthentication(新しいCookieAuthenticationOptions {....

私の質問:

  1. が主張する権利を私のセッションIDを設定していますここでのアプローチ?全体の認証プロセスでは、私はそのセッションIDの主張を検証することができます。また

  2. 、?

  3. 私の現在のアイデアは、リクエストごとにデータベーステーブルに対してこのsessionIdを検証することです。セッションIDを代わりに保存するためにRequest.Sessionsを使うべきですか?ユーザーが複数の有効なセッションを持つことができますので

おかげで、

+0

わかりません。これが役立ちます。 MVCプロジェクトを作成するときは、認証メソッドを設定するオプションがあります。サンプルコードを生成するはずです。私はあなたのユーザーのトラックを維持する状況に対して許容できるアプローチでなければなりません。 – Dragonvil

+0

ASP.NET IDを使用する私はapp.UseCookieAuthenticationを使用します(新しいCookieAuthenticationOptions {.... このオプションを使用してセッションIDを検証するにはどうすればよいですか? – spiros

+0

前回の回答で何か言及しておいたはずのこと: 'SecurityStampValidator'は、auth cookieをこの値と照らし合わせてチェックし、変更された場合にサインアウトします – Matthew

答えて

0

、あなたは、特許請求の範囲としてこれらを保存したり、それらを格納するために、独自のテーブルを作成する必要がありますどちらか。クレームはアイデンティティによって既に作成されているので、それは最も簡単です。

OnValidateIdentityの方法でCookieAuthenticationProviderStartup.Auth.csに入力して検証します。現在、SecurityStampValidatorOnValidateIdentityメソッドが呼び出されているため、セッションIDを最初にチェックして元のセキュリティスタンプバリデーターを呼び出すラッパーメソッドを記述する必要があります。たとえば、あなたはStartupクラスにこれらのメソッドを追加することができます。_validateだけのオリジナルの方法とvalidateある

private Func<CookieValidateIdentityContext, System.Threading.Tasks.Task> _validate=SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
      validateInterval: TimeSpan.FromMinutes(30), 
      regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)); 
private async Task validate(CookieValidateIdentityContext context) 
{ 
    var usermanager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 
    var claims = await usermanager.GetClaimsAsync(context.Identity.GetUserId()); 

    //instead of setting to true, add your session validation logic here 
    bool sessionIsValid=true; 

    if (!sessionIsValid) { 
     context.RejectIdentity(); 
     context.OwinContext.Authentication.SignOut(context.Options.AuthenticationType); 
    } 

    await _validate(context); 
} 

もセッションIDをチェックし、あなたの新しい方法です。私はあなたがデータベースからのクレームを毎回チェックする必要があると思うが、私はusermanager.GetClaimsAsyncが最終的にこれを行うだろうと信じて、この作業を行うには

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/Account/Login"), 
    Provider = new CookieAuthenticationProvider 
    { 
     // Enables the application to validate the security stamp when the user logs in. 
     // This is a security feature which is used when you change a password or add an external login to your account. 
     OnValidateIdentity = validate 

    } 
}); 

:次に、あなたのapp.UseCookieAuthenticationコードは、このような新しいvalidate方法を参照します。

関連する問題