How to get username without domain

Viewed 72284

In an aspx page I get the Windows username with the function Request.LogonUserIdentity.Name. This function returns a string in the format "domain\user".

Is there some function to only get the username, without resorting to the IndexOf and Substring, like this?

public static string StripDomain(string username)
{
    int pos = username.IndexOf('\\');
    return pos != -1 ? username.Substring(pos + 1) : username;
}
7 Answers

I don't believe so. I have got the username using these methods before-

var user = System.Web.HttpContext.Current.User;   
var name = user.Identity.Name;

var slashIndex = name.IndexOf("\\");
return slashIndex > -1 
    ? name.Substring(slashIndex  + 1)
    : name.Substring(0, name.IndexOf("@"));

or

var name = Request.LogonUserIdentity.Name;

var slashIndex = name.IndexOf("\\");
return slashIndex > -1 
    ? name.Substring(slashIndex  + 1)
    : name.Substring(0, name.IndexOf("@"));

If you are using .NET 3.5 you could always create an extension method to the WindowsIdentity class that does this work for you.

public static string NameWithoutDomain( this WindowsIdentity identity )
{
    string[] parts = identity.Name.Split(new char[] { '\\' });

    //highly recommend checking parts array for validity here 
    //prior to dereferencing

    return parts[1];
}

that way all you have to do anywhere in your code is reference:

Request.LogonUserIdentity.NameWithoutDomain();

static class IdentityHelpers
{
    public static string ShortName(this WindowsIdentity Identity)
    {
        if (null != Identity)
        {
            return Identity.Name.Split(new char[] {'\\'})[1];
        }
        return string.Empty;
    }
}

If you include this code, you could then just do something like:

WindowsIdentity a = WindowsIdentity.GetCurrent();
Console.WriteLine(a.ShortName);

Obviously in a web environment, you wouldn't write to the console - just an example...

An alternative way of doing the same thing as the other answers:

var usernameWithoutDomain = Path.GetFileName(@"somedomain\someusername")

It is just unsafe as not checking for the @ variant of usernames.

Related