我有一个MVC 5数据第一个应用程序,我一直在帮助。我让它使用过滤器来确定是否允许AD用户使用某些功能(通过装饰方法/类)。
但是,在更改数据库中的用户信息后,过滤器的上下文仍然具有该用户的旧信息。用户“编辑”'页面保持正确的信息。奇怪。这只发生在过滤器中,而不是在任何控制器中。
这是过滤器:
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!base.AuthorizeCore(httpContext)) return false;
// Get the groups for this authorization (from the decoration attribute)
var groups = Groups.Split(',').ToList();
var userDisplayName = string.Empty;
using (HostingEnvironment.Impersonate())
{
// Verify that the user is in the given AD group (if any)
var context = new PrincipalContext(
ContextType.Domain);
var userPrincipal = UserPrincipal.FindByIdentity(
context,
IdentityType.SamAccountName,
httpContext.User.Identity.Name);
userDisplayName = userPrincipal.DisplayName;
}
// check for UserRoles for this
var user = _varDB.Users.FirstOrDefault(x => x.UserName == userDisplayName); //< Here is where it gets stale info...
IList<UserRole> usersRoles = new List<UserRole>();
if (user != null)
{
usersRoles = user.UserRoles.ToList();
}
// determine if the user is allowed to see this controller/page
foreach (var ur in usersRoles)
{
if (groups.Contains(ur.RoleName))
{
return true;
}
}
return false;
}
在UserController上,如果我手动更改数据库并刷新页面,我会看到更改。但在此过滤器中,如果我更改数据,则在我回收应用程序池之前,它永远不会更改。
fyi,班上最重要的是:
public class AuthorizeByDbRoleAttribute : AuthorizeAttribute
{
private static ExtVariablesEntities _varDB = new ExtVariablesEntities();
}
如果此过滤器未获取更新的用户信息,则无法让用户退出或让他们使用功能(如果已更改且应用池未被回收)。
答案 0 :(得分:1)
问题是继承自AuthorizeAttribute(或我认为的任何属性)的类并不处理上下文。我结束了这样的使用逻辑:
using (ExtVariablesEntities _varDB = new ExtVariablesEntities())
{
// check for UserRoles for this
var user = _varDB.Users.FirstOrDefault(x => x.UserName == userDisplayName);
IList<UserRole> usersRoles = new List<UserRole>();
if (user != null)
{
usersRoles = user.UserRoles.ToList();
}
// determine if the user is allowed to see this controller/page
foreach (var ur in usersRoles)
{
if (groups.Contains(ur.RoleName))
{
return true;
}
}
}
这是每次触发此类方法时创建的上下文。