As you've guessed, the Membership API doesn't support what you want out of the box. In the past, I've used a helper class instead of creating my own provider. In this case it's pretty simple, maybe something like this:
public static object GetUserId() {
  return GetUserId(HttpContext.Current.User.Identity.Name, true);
}    
public static object GetUserId(string userName) {
  return GetUserId(userName, true);
}
public static object GetUserId(string userName, bool UpdateLastActivity) {
  using (SqlConnection c = new SqlConnection(CONNECTION_STRING)) {
    string sql = @"
DECLARE @UserId uniqueidentifier
SELECT @UserId=u.UserId
FROM dbo.aspnet_Applications AS a
  ,dbo.aspnet_Users AS u
  ,dbo.aspnet_Membership AS m
WHERE
  a.LoweredApplicationName=LOWER(@ApplicationName)
  AND u.ApplicationId=a.ApplicationId
  AND u.LoweredUserName=LOWER(@UserName)
  AND u.UserId=m.UserId;
IF @UserId IS NOT NULL AND @UpdateLastActivity=1
  UPDATE dbo.aspnet_Users
  SET LastActivityDate=@CurrentTimeUtc
  WHERE UserId=@UserId;
SELECT @UserId  
      ";
    using (SqlCommand cmd = new SqlCommand(sql, c)) {
      cmd.Parameters.AddWithValue("@ApplicationName", Roles.ApplicationName);
      cmd.Parameters.AddWithValue("@UserName", userName);
      cmd.Parameters.AddWithValue("@UpdateLastActivity", UpdateLastActivity);
      cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow);
      object id = null;
      c.Open();
      id = cmd.ExecuteScalar();
      return id != DBNull.Value ? id : null;
    }
  }
}
Above is pretty similar to what's done in the Membership API when calling GetUser()