【问题标题】:What happens when you call UserPrincipal.Current.GivenName from a non AD account?当您从非 AD 帐户调用 UserPrincipal.Current.GivenName 时会发生什么?
【发布时间】:2017-02-20 12:47:03
【问题描述】:

尝试按如下方式设置自定义用户检查:

currentSessionUser = new User() //Nope, lets pull information from the Active Directory
{
    FirstName = UserPrincipal.Current.GivenName,
    LastName = UserPrincipal.Current.Surname,
    Username = UserPrincipal.Current.SamAccountName,
    AccountState = 0
};

当您的客户是非 AD 帐户或移动设备时会发生什么?

如何在此处捕获错误?

【问题讨论】:

  • 'Current' 属性从进程\线程令牌中获取当前用户 SID,如果是 AD 帐户,则通过 LDAP 协议从 AD 中获取信息;如果是本地帐户,则从使用 WinNT 协议的本地计算机中获取信息。如果找不到帐户 SID,则抛出 NoMatchingPrincipalException,如果无法检索 SID 信息,该函数将抛出 PrincipalOperationException。我确实怀疑移动设备(甚至在 Windows 手机上)是否支持 S.DS.AM
  • 那么检查当前属性中的空值是否是处理非 AD 设备的最佳方式?我不太关心实际处理移动设备——而且锁定无法通过简单的用户名检查进行身份验证的设备。
  • 我只能声称,如果您在基于 Windows 的计算机上的本地帐户下运行该进程并调用“当前”属性,大多数值将具有空值(UserPrincipal.Current.SamAccountName 将设置)
  • 只是为了确保我们在同一页面上。我想您有一个在 IIS 上运行的 ASP.NET 应用程序(可能是独立工作站或加入域)。 UserPrincipal.Current 将返回启动进程的用户(默认情况下在 IIS 中或在 web.config 中指定的应用程序池),或当前线程在下模拟的用户帐户

标签: asp.net-mvc error-handling asp.net-mvc-5 active-directory userprincipal


【解决方案1】:

正确捕获可以抛出的异常-PrincipalServerDownException 您只需要将试图查询 userprincipal 的区域封装在前面提到的异常类型的 catch 块中。

    try
    {
        u = new User
        {
            FirstName = UserPrincipal.Current.GivenName,
            LastName = UserPrincipal.Current.Surname,
            Username = UserPrincipal.Current.SamAccountName,
            Guid = UserPrincipal.Current.Guid.ToString(),
            CanEditHidData = true,
            CanEditQaData = true,
            AccountState = 0 //0=Unlocked 1=HigherPrivs Privs 2=Locked
        };
        return u;
    }
    catch (PrincipalServerDownException e)
    {
        u = new User
        {
            FirstName = "Guest",
            LastName = "Account",
            Username = "guest",
            Guid = Guid.Empty.ToString(),
            CanEditHidData = false,
            CanEditQaData = false,
            AccountState = 3 //0=Unlocked 1=HigherPrivs Privs 2=Locked 3=Guest
        };
        ViewBag.ErrorMessage = e.Message;
        View("Error");
        return u;
    }

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2017-07-12
    • 2016-11-11
    • 2016-01-24
    • 2010-12-07
    相关资源
    最近更新 更多