异常详细信息:System.Security.SecurityException:指定的登录会话不存在。它可能已经被终止了

时间:2017-05-16 15:52:57

标签: c# asp.net iis securityexception

我将测试Web应用程序部署到虚拟Windows Server 2008 std。 IIS没有分配给此应用程序的证书功能,也没有分配给此服务器上的任何应用程序,因此我发现的解决方案都与我的问题无关。同一服务器上的所有其他应用程序工作正常,这使我得出结论问题必须与我用于在global.asax文件中进行身份验证的代码。

我已检查过gpedit.msc和网络访问:不允许存储凭据 ials已被禁用。 This posting最接近我能够找到的问题,但没有接受任何解决方案。我已经检查了MMC,但它没有任何内容,只有一个空的Console Root节点,因此没有任何内容可以删除并重新安装,因为有人建议使用herehere。我无法从工作中访问博客网站 - 有些听起来很有希望,但我无法阅读它们。我将完全信任添加到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());
        }

    }  

1 个答案:

答案 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;
                }
            }
        }
    }