Owin授权超时后,EF抛出AspNetUsers错误

时间:2017-05-10 15:22:04

标签: c# asp.net-mvc entity-framework asp.net-identity owin

我已在AccountController申请MVC5中覆盖了授权。它可以正常登录和注销,获取上下文等。但是,如果授权超时,而不是将我重定向回Login页面,则会抛出错误:

  

无效的对象名称&#d ;.AspNetUsers'。

我没有在身份验证中使用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页面 - 我怀疑有什么东西可以检查会话在某个地方是否仍然有效但我和我不确定在哪里。

感谢。

更新

如果我删除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))
            }
        });     

1 个答案:

答案 0 :(得分:4)

我知道您已经找到了解决问题的方法。如果您没有使用EF来保存用户数据,那么从解决方案中删除大多数Identity包并且只留下所需的OWIN包是安全的。

你看到这种效果的原因是因为这一点:

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

每30分钟执行一次请求,并检查当前cookie是否与数据库中的数据相同。实际上调用默认值ApplicationUserManager默认连接到EF,默认情况下期望AspNetUsers表存在。不,您在解决方案中找不到此字符串 - 此表在IdentityDbContext上定义,由身份的EF部分提供。

我怀疑让ApplicationDbContext继承DbContext而非IdentityDbContext继承是安全的 - 这样就可以删除任何可能会丢失您不会丢失的表格的可能性需要。然后,您可以删除ApplicationUserManager(因为它预期IdentityDbContext)。

我已经blogged关于使用AD作为服务来设置OWIN cookie - 其中一些可能对您有用。