2017-05-10 2 views
2

AccountControllerの承認を、MVC5アプリでオーバーライドしました。Owin Authorizationタイムアウト後にEFがAspNetUsersエラーを投げる

Invalid object name 'dbo.AspNetUsers'.

私が使用していない:それはとアウトの許可時間は、代わりに戻っLoginページに私をリダイレクトする、それがエラーをスローした場合、ただしなど、コンテキストを取得し、ログアウトで罰金ログの作品認証にはEFが、サービスではないので、私はこれらのテーブルを持っていません。しかし、私はエラーをスローするためにこのコードを打っている場所を見つけることができません。

AccountController.cs:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     var userRequest = new RequestObject 
     { 
      Name = model.Username, 
      Password = model.Password 
     }; 

     try 
     {     
      var result = await client.LoginUserAsync(userRequest); 

      if (result == 0) 
      { 
       var user = new User 
       { 
        Name = model.Username 
       }; 

       OwinSignIn(user); 

       return RedirectToAction("Index", "Home"); 
      } 
     } 
     catch (Exception) 
     { 
      // TODO: log error 
     } 

     ModelState.AddModelError("", "Invalid login attempt."); 
     return View(model); 
    } 


    private void OwinSignIn(User user, bool isPersistence = false) 
    { 
     var claims = new[] { 
      new Claim(ClaimTypes.Name, user.Name) 
     }; 

     var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 

     var result = client.GetUserRoles(userRequest); 
     var roles = result.Roles.ToList(); 

     if (roles.Any()) 
     { 
      var roleClaims = roles.Select(r => new Claim(ClaimTypes.Role, r.Name)); 
      identity.AddClaims(roleClaims); 
     } 

     AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistence }, identity); 
    } 

私が署名し、期限切れにその承認を待っていた場合でも、このは唯一起こります。私はちょうどそれがちょうどLoginページに戻ることを確かめるために私が更新しなかった方法を確信していません - セッションをチェックしている何かがまだどこかで有効ですが、私はどこがわからないのですか?

ありがとうございました。

UPDATE:私はOnValidateIdentity呼び出しを削除した場合

、問題が消えます。これを修正できるかどうかわからない場合は...

 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 = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     });  
+0

あなたは 'AspNetUsers'というテーブルを持っていませんか?奇妙な。ソリューションでその文字列を検索しましたか? –

+0

@MariaInesParnisari - いいえ、私はそのテーブルを持っていません。前述のように、独自のテーブルに対する認証を処理する既存のWebサービスがあります。質問の中のメソッドをオーバーライドすると、それを使ってログインすることができます。どこかでSessionEndで何かが起こっていて、そこから戻ってそのテーブルを探しています。その文字列は解のどこにも見つかりません。 – ragerory

+0

Authorize属性をオーバーライドしましたか? –

答えて

4

私はあなたの問題に対する解決策をすでに見つけたと思います。 EFを使用してユーザーデータを保持していない場合は、ソリューションからほとんどのIdentityパッケージを削除して、必要なOWINパッケージのみを残しても安全です。現在のクッキーは、データベース内のデータと同じである場合には、リクエストに応じて30分ごとやチェックを実行する

OnValidateIdentity =  
    SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
         validateInterval: TimeSpan.FromMinutes(30), 
         regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 

:あなたはこのビットので、この効果は見

理由。実際にはデフォルトでApplicationUserManagerが呼び出されており、デフォルトではEFに配線されており、デフォルトではAspNetUsersテーブルが存在すると想定しています。いいえ、ソリューション内でこの文字列を見つけることはできません。このテーブルはIdentityDbContextで定義されており、アイデンティティのEF部分で提供されています。

ApplicationDbContextIdentityDbContextからではなくDbContextから継承することが安全であると思われます。これは不要なテーブルをヒットする可能性を排除します。それに続いてApplicationUserManagerを削除することができます(期待どおりにIdentityDbContext)。

私はbloggedで、OWINクッキーを設定するサービスとしてADを使用しています。このうちのいくつかはあなたにとって役に立つかもしれません。

+1

はい、私はそのビットを削除してこれを修正することができました。何が起こっているかを完全に理解しているので、これを答えとしてマークしています。あなたのブログの投稿は、組み込みの実装を置き換えることを望んでいる人にとって非常に役に立ちます。ありがとう。 – ragerory

関連する問題