BO SDK(.NET)を介してBusinessObjectsのWeb GUIを実装していますが、認証トークンを永続化して複数のユーザー間で共有する方法が必要です。特定のビジネス要件は、1回のログイン(この場合はActiveDirectoryからのサービスアカウント)のみであるということです。最初にログインしてから、最初のログインで生成されたデフォルトのトークンを使用して後続のログインを実行することに問題はありませんでした。問題は、トークンを使用して2回目の試行でログインすると、トークンが上書きされることです。
元のトークン値を上書きする完全ログインを完了せずに、トークンが有効かどうかを確認する方法が必要です。私の計画は、トークンをキャッシュに保持し、各レポート要求が行われるたびにWCFを介して提供し、トークン値が有効でなくなった場合にのみ再生成することです。各レポートの最終的な要求は、認証を提供するためにOpenDocumentURLにクエリ文字列パラメーターとしてトークンを含めることで完了します。
次のコードを使用して、トークンを介して完全ログインを完了することができます。//元のログインSessionMgr ses = new SessionMgr(); EnterpriseSession es = ses.Logon(user、pass、server、type);
//Get the token
LogonTokenMgr myToken = es.LogonTokenMgr;
string BOToken = myToken.DefaultToken;
//Login with the generated token
EnterpriseSession esToken = ses.LogonWithToken(BOToken);
元のトークンを引数として取り、それが有効なBusinessObjectsセッションに関連付けられているかどうかを判断するメソッドが見つかりません。マルチユーザー環境であり、上書きによって前のトークン/セッションが無効になり、無効なトークンに依存している場合はユーザーが不安定になるため、ログインごとにトークンを上書きすることはできません(LogonWithTokenメソッドを使用する場合に発生します)。 。
トークンを上書きせずにトークンの有効性をチェックするBOSDKライブラリのメソッドを知っている人はいますか?スタックに付属しているすべての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;
}
}
}