我正在开发一个WebAPI站点,它包含一些在以前的服务器上运行的登录逻辑,以及在开发/本地主机上,但在将其部署到新的IIS服务器(之前的服务器崩溃,不可恢复)之后无法工作。
现在配置数据库和Web服务器是服务器上的同一个VM,因此我们再次没有这个裸机问题。新服务器是2012 R2运行最新的IIS更新。登录过程或我们的网站工作正常,但现在我们收到此错误:
Exception Details: System.NotSupportedException: Only parameterless constructors and initializers are supported in LINQ to Entities
堆栈跟踪引导我使用此代码:
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
if (!Request.IsAuthenticated) return;
using (var db = new PerformanceSecurityRoleContext())
{
var user = User as ClaimsPrincipal;
var userEntry = db.Users.FirstOrDefault(x => x.IdSid.ToLower().Equals(user.Identity.Name.ToLower()));
var roles = userEntry == null
? FindRolesByGroups(db, User as WindowsPrincipal)
: FindRolesByUser(db, userEntry);
if(roles == null) return;
foreach (var role in roles)
{
var id = new ClaimsIdentity();
id.AddClaim(new Claim(ClaimTypes.Role, role.Name));
ClaimsPrincipal.Current.AddIdentity(id);
}
}
}
private static IEnumerable<Role> FindRolesByUser(PerformanceSecurityRoleContext db, User user)
{
return db.UserRoles.Where(x => x.UserId.Equals(user.Id)).Select(x => x.Role);
}
private static IEnumerable<Role> FindRolesByGroups(PerformanceSecurityRoleContext db, WindowsPrincipal user)
{
var groupList = (db.Groups.Select(g => new {g, name = new SecurityIdentifier(g.Name)})
.Where(@t => user.IsInRole(@t.name))
.Select(@t => @t.g)).ToList();
var rolesList = new List<Role>();
foreach (var g in groupList)
{
rolesList.AddRange(g.GroupRoles.Select(x => x.Role));
}
return rolesList.Distinct();
}
特别是,似乎是这一行:
var groupList = (db.Groups.Select(g => new {g, name = new SecurityIdentifier(g.Name)})
.Where(@t => user.IsInRole(@t.name))
.Select(@t => @t.g)).ToList();
为什么它在localhost和以前的服务器上工作但现在不工作?如果我之前很幸运,我需要打好具体的电话,我需要学习一些东西,但在我看来是一个配置问题。我花了几个小时寻找答案,但我一定是在问错误的问题。