我已在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))
}
});
答案 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 - 其中一些可能对您有用。