Как проверить, существует ли токен EnterpriseSession в BusinessObjects SDK - PullRequest
1 голос
/ 05 ноября 2011

Я реализую веб-интерфейс для BusinessObjects через BO SDK (.NET), и мне нужен способ сохранения и обмена токеном аутентификации среди нескольких пользователей.Конкретным бизнес-требованием является наличие единого входа (в данном случае это учетная запись службы из ActiveDirectory).У меня не было проблем с первым входом в систему и последующим выполнением последующих входов через токен по умолчанию, созданный при первом входе в систему.Проблема в том, что при использовании токена для входа во вторую попытку токен перезаписывается.

Мне нужен способ проверить, является ли токен БЕЗ завершения полного входа в систему, который перезаписывает исходное значение токена.Мой план состоит в том, чтобы хранить токен в кэше и обслуживать его через WCF при каждом запросе отчета, восстанавливая значение токена только в том случае, если он больше не действителен.Окончательный запрос для каждого отчета завершается включением токена в качестве параметра строки запроса в URL-адрес OpenDocument для обеспечения аутентификации.

Я могу завершить полный вход в систему через токен со следующим кодом: // Исходный вход в систему SessionMgr ses =новый SessionMgr ();EnterpriseSession es = ses.Logon (пользователь, пароль, сервер, тип);

//Get the token
LogonTokenMgr myToken = es.LogonTokenMgr;
string BOToken = myToken.DefaultToken;

//Login with the generated token
EnterpriseSession esToken = ses.LogonWithToken(BOToken);

Я не могу найти метод, который принимает исходный токен в качестве аргумента и определяет, связан ли он с допустимым BusinessObjectsсессия.Перезапись токена при каждом входе в систему (что происходит при использовании метода LogonWithToken) - не вариант, поскольку это многопользовательская среда, а перезапись делает недействительным предыдущий токен / сеанс, оставляя пользователя в подвешенном состоянии, если он полагается на недопустимый токен.

Кто-нибудь знает метод в библиотеках BO SDK, который будет проверять действительность токена БЕЗ его перезаписи?У меня есть доступ ко всем библиотекам DLL, которые поставляются со стеком ...

ОБНОВЛЕНИЕ:

Поскольку в SDK, похоже, отсутствует специальный метод проверки токена, я создал рабочий HACK.После создания действительного токена я помещаю его в кеш и «проверяю» его при последующих вызовах, пытаясь инициализировать EnterpriseSession из кэшированного токена.Если создание сеанса завершается неудачно, предполагается, что токен недействителен, а новый генерируется и возвращается в службу кэширования для хранения (извините, если форматирование выключено - я новичок в уценке):

Надеюсь, кто-тосоздал «реальное» решение этой проблемы, но следующий код работает хорошо:

public static class BusinessObjectsAuth
{


    public static string GetBOToken (string currentToken = null)
    {
        if (!ValidateToken(currentToken))
        {
            //This is aprt a custom encryption piece - needed unless you are         comfortable storing pw in plain text in config file
            Crypt decrypter = new Crypt();

            //Generate a new token
            SessionMgr ses = new SessionMgr();
            EnterpriseSession es = ses.Logon(AppSettings.BusinessObjectsUser, decrypter.DecryptString(AppSettings.BusinessObjectsPass), AppSettings.BusinessObjectsUrl, "secWinAD");
            LogonTokenMgr myToken = es.LogonTokenMgr;

            //The token generated below is good on any client for an unlimited number of logins for 24 hours
            //This may or may not be a good idea based on the security of your network
             return myToken.CreateLogonTokenEx("", 1440, -1);
        }
        else
        {
            //If the token is still valild return it
            return currentToken;
        }

    }

    public static bool ValidateToken(string currentToken = null)
    {
        SessionMgr ses = new SessionMgr();
        try
        {
            //Check to see if the token can be used for logon - close the session afterwards
            EnterpriseSession es = ses.LogonWithToken(currentToken);
            es.Logoff();
            return true;
        }
        catch (Exception ex)
        {
            //This is a workaround for the fact that the BO SDK does not include a built in method for verifying
            //that a token is valid - we can only assume it's a bad token if the logon attempt in the try block fails
            string message = ex.Message;
            return false;
        }
    }
}

1 Ответ

1 голос
/ 07 ноября 2011

Возможно EnterpriseSession.IsServerLogonSession метод?

Вы также можете поэкспериментировать с методом CreateLogonTokenEx . Вы сможете указать, сколько входов разрешено.

...