我将测试Web应用程序部署到虚拟Windows Server 2008 std。 IIS没有分配给此应用程序的证书功能,也没有分配给此服务器上的任何应用程序,因此我发现的解决方案都与我的问题无关。同一服务器上的所有其他应用程序工作正常,这使我得出结论问题必须与我用于在global.asax文件中进行身份验证的代码。
我已检查过gpedit.msc和网络访问:不允许存储凭据 ials已被禁用。 This posting最接近我能够找到的问题,但没有接受任何解决方案。我已经检查了MMC,但它没有任何内容,只有一个空的Console Root节点,因此没有任何内容可以删除并重新安装,因为有人建议使用here和here。我无法从工作中访问博客网站 - 有些听起来很有希望,但我无法阅读它们。我将完全信任添加到web.config中没有区别,并注意到IIS中的.NET Trust Levels已经设置为Full(内部)。
完整的错误消息是:
System.Security.SecurityException: A specified logon session does not exist. It may already have been terminated.
at System.Security.Principal.WindowsIdentity.KerbS4ULogon(String upn)
at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName, String type)
at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName)
at EPRSystem.Global.IsInADGroup(String user, String group)
at EPRSystem.Global.Application_AuthenticateRequest(Object sender, EventArgs e)
The Zone of the assembly that failed was:
MyComputer
对我有什么想法?
这是我的全球代码:
public Boolean IsAdmin;
public Boolean IsManager;
public Boolean IsDeveloper;
string UserName;
public String GetUserName()
{
WindowsIdentity wiCurrentUser;
wiCurrentUser = WindowsIdentity.GetCurrent();
String strUserName = wiCurrentUser.Name;
String[] strParts = strUserName.Split('\\');
strUserName = strParts[1];
return strUserName;
}
public Boolean IsInADGroup(string user, string group)
{
using (var identity = new WindowsIdentity(user))
{
var principal = new WindowsPrincipal(identity);
return principal.IsInRole(group);
}
}
protected void Session_Start(object sender, EventArgs e)
{
//Write method: Get current user's username
UserName = HttpContext.Current.User.Identity.Name; //get AD name of user
HttpContext.Current.Session["UserName"] = GetUserName();
HttpContext.Current.Session["IsAdmin"] = IsInADGroup(HttpContext.Current.Session["UserName"].ToString(), "group1");
HttpContext.Current.Session["IsManager"] = IsInADGroup(HttpContext.Current.Session["UserName"].ToString(), "group2");
HttpContext.Current.Session["IsDeveloper"] = IsInADGroup(HttpContext.Current.Session["UserName"].ToString(), "group3");
}
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
//Write method: Identity/Authenticate current user
DAL.ErrorLog oErrorLog = new DAL.ErrorLog();
try
{
String strUser = GetUserName();
IsAdmin = IsInADGroup(strUser, "group1");
IsManager = IsInADGroup(strUser, "group2");
IsDeveloper = IsInADGroup(strUser, "group3");
}
catch (System.Security.SecurityException ex)
{
oErrorLog.WriteErrorLog(ex.ToString());
}
}
答案 0 :(得分:0)
我在Shawn Farkas阅读了这篇文章,主要关注他的评论“ 1.确定导致您的应用程序抛出的权限要求,并尝试将您的应用程序修改为不需要这些权限更多。抛出的SecurityException应该告诉你哪个需求 失败。
我完全从Global.asax中删除了授权代码,将其移至Default.aspx.cs。我替换了IsInADGroup(x,y)
方法,该方法是错误产生的地方,在CheckGroupMembership().
的新方法中由marc_s建议的代码混合我实例化了一个包含以下内容的全局数组变量groupName[]
三个AD组我想检查成员资格,最终这些值IsMember[]
被传递给Session变量,因此它们可以在另一个页面上使用。解决方案的核心是这种方法:需要名称空间System.DirectoryServices.AccountManagement
public void CheckGroupMembership()
{
// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "XXX");
// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, GetUserName());
for (int i = 0; i < 3; i++)
{
// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, groupName[i]);
if (user != null)
{
// check if user is member of that group
if (user.IsMemberOf(group))
{
IsMember[i] = true;
}
else
{
IsMember[i] = false;
}
}
}
}