如何从内部asp web应用程序获取Windows认证用户guid?

时间:2012-03-28 19:09:55

标签: c# asp.net iis-7 active-directory windows-authentication

好的,所以这在我的VS测试服务器中工作(当然),但是一旦我发布到IIS,它就会中断。我需要做的就是能够获得当前登录到机器的用户的GUID(不是SID)。使用DirectoryServices,这是我最初的实现:

var guid = UserPrincipal.Current.Guid.ToString();

这给了我一个错误,我无法从GroupPrincipal转换为UserPrincipal。所以听起来应用程序试图作为一些经过身份验证的组运行。我知道,正常的方法会像HttpContext.Current.User.Identity,但我不知道该怎么办,因为它没有Guid属性,当我尝试将其转换为SID并运行LDAP查询时,它会引发异常。有人可以帮助我完成这个必要的步骤吗?

由于

更新: 好的,这是我最近的尝试:

protected string GetUserGuid()
    {
        var pc = new PrincipalContext(ContextType.Domain);
        var windowsID = HttpContext.Current.User.Identity;
        var up = UserPrincipal.FindByIdentity(pc, windowsID.Name);
        return up.Guid.ToString();
    }

我得到的例外:

  

[COMException(0x8007054b):指定的域不存在   或无法联系。 ]
  System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)+788   System.DirectoryServices.DirectoryEntry.Bind()+44
  System.DirectoryServices.DirectoryEntry.get_AdsObject()+42
  System.DirectoryServices.PropertyValueCollection.PopulateList()+29
  System.DirectoryServices.PropertyValueCollection..ctor(的DirectoryEntry   entry,String propertyName)+63
  System.DirectoryServices.PropertyCollection.get_Item(字符串   propertyName)+163
  System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()   +436 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()   +51 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()   +141 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()   +42 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext   context,Type principalType,Nullable`1 identityType,String   identityValue,DateTime refDate)+29
  System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext   context,String identityValue)+95 TicketsToMe.GetUserGuid()+123
  TicketsToMe.Page_Load(Object sender,EventArgs e)+38
  System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object   o,Object t,EventArgs e)+25 System.Web.UI.Control.LoadRecursive()   +71 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   3048

1 个答案:

答案 0 :(得分:1)

如果某些东西在本地运行但在IIS上运行,那么它可能是一个权限。您是否检查过IIS上的信任级别?本地VS测试服务器在完全信任的情况下运行,但IIS(尤其是7)网站可能设置为中等或更低。这导致了我之前遇到类似结果的问题,即在本地运行但在IIS上没有运行。

还值得检查app pool用户的权限。