If you see the code for the **Edit User** Dialogue from the **User Manager**, here is the location of the file in the Sitecore webroot. 

    inetpub\wwwroot\<your application root>\sitecore\shell\Applications\Security\EditUser\EditUser.xaml.xml

This file refers to the DLL i.e. `Sitecore.Client` and the event is written in this class `Sitecore.Shell.Applications.Security.EditUser.EditUserPage`. And here is the code snippet to add Edit User or Role. 

    protected override void OK_Click()
    {
      if (!this.Validate() || !this.ValidateTicket())
    	return;
      User user = EditUserPage.GetUser();
      Assert.IsNotNull((object) user, typeof (User), "User not found");
      UserProfile profile = user.Profile;
      Assert.IsNotNull((object) profile, typeof (UserProfile));
      try
      {
    	IEnumerable<Role> roles = this.Roles.Items.Cast<System.Web.UI.WebControls.ListItem>().Where<System.Web.UI.WebControls.ListItem>((Func<System.Web.UI.WebControls.ListItem, bool>) (item => System.Web.Security.Roles.RoleExists(item.Value))).Select<System.Web.UI.WebControls.ListItem, Role>((Func<System.Web.UI.WebControls.ListItem, Role>) (item => Role.FromName(item.Value)));
    	HttpContext current = HttpContext.Current;
    	Assert.IsNotNull((object) current, typeof (HttpContext));
    	string controlValue = string.Empty;
    	foreach (string key in current.Request.Form.Keys)
    	{
    	  if (key != null && key.EndsWith("StartUrlSelector", StringComparison.InvariantCulture))
    	  {
    		controlValue = current.Request.Form[key];
    		break;
    	  }
    	}
    	if (controlValue == "Default")
    	  controlValue = string.Empty;
    	if (controlValue == "Custom")
    	  controlValue = this.StartUrl.Text;
    	user.Roles.Replace(roles);
        ....
        ....
    }

So you can override this class and replace it in the XML file to use your logic. 

I hope this will help.