user3519261
user3519261

Reputation: 79

Thread.CurrentPrincipal returning empty string

I'm trying to get Thread.CurrentPrincipal.Identity.Name and it seems to be returning an empty string.

I've tried running as administrator and as a different user and it's still doing it. If I go to the Claims on the object, the issuer was LOCAL AUTHORITY. Shouldn't this then return the user I'm logged in as?

public string GetCurrentUser()
        {
            var principal = Thread.CurrentPrincipal.Identity.Name;

            //Thread.CurrentPrincipal.Identity
            return principal;
        }

Upvotes: 1

Views: 830

Answers (1)

user2984635
user2984635

Reputation: 36

CurrentPrincipal property uses internal GetThreadPrincipal method of AppDomain type to build IPrincipal object by default.

internal IPrincipal GetThreadPrincipal()
{
  IPrincipal principal;
  if (this._DefaultPrincipal == null)
  {
    switch (this._PrincipalPolicy)
    {
      case PrincipalPolicy.UnauthenticatedPrincipal:
        principal = (IPrincipal) new GenericPrincipal((IIdentity) new GenericIdentity("", ""), new string[1]
        {
          ""
        });
        break;
      case PrincipalPolicy.NoPrincipal:
        principal = (IPrincipal) null;
        break;
      case PrincipalPolicy.WindowsPrincipal:
        principal = (IPrincipal) new WindowsPrincipal(WindowsIdentity.GetCurrent());
        break;
      default:
        principal = (IPrincipal) null;
        break;
    }
  }
  else
    principal = this._DefaultPrincipal;
  return principal;
}

GetThreadPrincipal method uses PrincipalPolicy which is UnauthenticatedPrincipal by default.

You can change default behavior. For example you can use SetPrincipalPolicy method of AppDomain with PrincipalPolicy.WindowsPrincipal to get a Windows user

    var appDomain = AppDomain.CurrentDomain;
    appDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    var principal = Thread.CurrentPrincipal;
    var user = principal.Identity.Name;

Upvotes: 1

Related Questions