Я реализую веб-интерфейс для 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;
}
}
}