English

How To: Get the current user name and roles using a server object extension

Summary

This article provides code samples for .NET and Java REST server object extensions (SOEs), showing how the user name and roles for an SOE user accessing a secured ArcGIS Server resource can be obtained.

Procedure

The first section below shows the code snippet in C# for a .NET SOE, and the second section provides sample code written in Java. Depending upon the language of choice, follow either solution.

  • Code snippet (C#)

    First, obtain a pointer to the IServerEnvironment interface. It has a UserInfo property of IServerUserInfo type. From that property, the user name and roles can be obtained.
        public IServerEnvironment3 GetServerEnvironment()
        {
            UID uid = new UIDClass();
            uid.Value = "{32D4C328-E473-4615-922C-63C108F55E60}";

            //use activator to cocreate singleton
            Type t = Type.GetTypeFromProgID("esriSystem.EnvironmentManager");
            System.Object obj = Activator.CreateInstance(t);
            IEnvironmentManager environmentManager = obj as IEnvironmentManager;
            return (environmentManager.GetEnvironment(uid) as IServerEnvironment3);
        }

Use the IServerEnvironment to get the user information. Below is a sample of a REST resource handler method called AdminInfo. This method can be used exactly like other methods in the SOE examples provided in the .NET ArcObjects SDK.

private byte[] AdminInfo(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties) { 
responseProperties = null;
 IServerEnvironment3 senv = GetServerEnvironment() as IServerEnvironment3; 
JsonObject result = new JsonObject(); 
JsonObject suinfoj = new JsonObject();
 //get user info and serialize into JSON 
IServerUserInfo suinfo = senv.UserInfo;
 if (null != suinfo) { 
suinfoj.AddString("currentUser", suinfo.Name);
 IEnumBSTR roles = suinfo.Roles; 
List<string> rolelist = new List<string>(); 
if (null != roles) { 
string role = roles.Next(); 
while (!string.IsNullOrEmpty(role)) {
 rolelist.Add(role);
 role = roles.Next(); 
} } 
suinfoj.AddArray("roles", rolelist.ToArray());
 result.AddJsonObject("serverUserInfo", suinfoj); 
} else { result.AddJsonObject("serverUserInfo", null); }
 return Encoding.UTF8.GetBytes(result.ToJson()); 
}

This code returns the following JSON:

{
 "serverUserInfo": {
  "currentUser": "demo",
  "roles": [
   "admin",
   "publisher"
  ]
 }
}
  • Code snippet (Java)

    If a REST SOE has a subresource called UserCredentials, it could have the following implementation in Java:

private byte[] getSubresourceUserCredentials() throws Exception {

	EnvironmentManager envMgr = new EnvironmentManager();

	UID envUID = new UID();
	envUID.setValue("{32d4c328-e473-4615-922c-63c108f55e60}");
	Object envObj = envMgr.getEnvironment(envUID);
	JSONObject userInfoJSON = new JSONObject();
	try {
	    IServerEnvironment2 env = new IServerEnvironment2Proxy(envObj);
            //get user info and serialize into JSON
	    IServerUserInfo userInfo = env.getUserInfo();
	    if(userInfo == null)
	    {
		userInfoJSON.put("error", "UserInfo is null. No user/roles configured.");
	    }
	    else
	    {
		userInfoJSON.put("userName", userInfo.getName());
		IEnumBSTR strEnum = userInfo.getRoles();
		String roleName = strEnum.next();
		StringBuffer rolesBuffer = new StringBuffer();
		while(!roleName.isEmpty())
		{
		    rolesBuffer.append(roleName + ";");		    
		    roleName = strEnum.next();
		}
		userInfoJSON.put("roles", rolesBuffer.toString());
	    }
	    
	} catch (Exception e) {
	    this.serverLog.addMessage(3, 200, "Exception: " + e.getMessage());
	}

	return userInfoJSON.toString().getBytes("utf-8");
    }