【问题标题】:Why does UserPrincipal.FindByIdentity return an error about GUID being 32 bits?为什么 UserPrincipal.FindByIdentity 返回关于 GUID 为 32 位的错误?
【发布时间】:2013-01-17 19:08:05
【问题描述】:

我的应用程序使用UserPrincipal 类来确定用户所属的组,然后使用该信息来确定用户是否经过身份验证才能使用我的应用程序。一段时间内一切正常,但最近我开始遇到异常

Guid 应包含 32 位数字和 4 个破折号 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

拨打UserPrincipal.FindByIdentity时。看起来调用成功并且异常处理得当,但让我担心将来身份验证会突然中断。我没有在任何地方明确创建 GUID,所以我不知道异常来自哪里。

【问题讨论】:

  • 如果遇到异常,调用如何成功?
  • 我的调试器设置为中断异常。异常在框架代码的某个地方被抛出,但它正在那里被处理,所以它不会在堆栈中冒泡。也许这就是它应该工作的方式?不过,我很确定它以前不是这样工作的。
  • 可能 - 这不是检查某些情况的常见方法 - 尝试一下,如果它引发异常,请吞下它并做其他事情。
  • 你能告诉哪里异常是在框架代码中抛出的吗? (以及从那时起的堆栈跟踪)

标签: c#


【解决方案1】:

很可能是在框架代码深处抛出异常,该异常试图从无效的 GUID 值初始化某种安全描述符。如果框架能捕捉到它并在内部处理它,我就不用担心了。

跟踪框架代码,这里有一个可能发生的地方:

protected static bool IdentityClaimToFilter(string identity, string identityFormat, ref string filter, bool throwOnFail)
{
  if (identity == null)
    identity = "";
  StringBuilder filter1 = new StringBuilder();
  switch (identityFormat)
  {
    case "ms-guid":
      Guid guid;
      try
      {
        guid = new Guid(identity);
      }
      catch (FormatException ex)
      {
        if (throwOnFail)
          throw new ArgumentException(ex.Message, (Exception) ex);
        else
          return false;
      }
...

注意它尝试创建一个新的Guid,如果失败,则会抛出异常,但代码会吞下它并返回 false

【讨论】:

  • 是的,这正是引发异常的地方。向后工作,直到几天前我安装 .NET Reflector 时才开始注意到。我使用反射器(就像你一样)生成 PDB,然后介入,直到发生异常。当我无法预反射器时,不知道反射器是如何使我能够首先打破它的。无论如何,这似乎无伤大雅。感谢您的帮助。
【解决方案2】:

如果您提供 IdentityType,它不会尝试将您的值视为 Guid,因此不会抛出异常

FindByIdentityWithType(context, typeof(UserPrincipalEx), **IdentityType.SamAccountName**, identityValue);

【讨论】:

  • 这是对我有用的解决方案。不知道为什么它突然开始发生。用来工作就好了。但这是一个可靠的解决方案。
【解决方案3】:

我的调试系统突然开始出现这种情况,我不知道为什么。原来,当我删除一个 .user 文件时,我似乎禁用了Just My Code 调试,并且这个异常开始被破坏。因此,请检查您在该区域周围的 VS 选项,您(可能)希望勾选此选项:

【讨论】:

    【解决方案4】:

    只有以下方式对我有用。

    var user = _userManager.FindByNameAsync(HttpContext.User.Identity.Name);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2021-02-09
      • 1970-01-01
      相关资源
      最近更新 更多