質問者
SSO 登録時に SSO_E_ACCESSDENIED

質問
-
いつも助けていただいています。
MOSS2007 で、SSOの登録処理を行うアプリケーションを作成しています。
一般のユーザが、サイトのリンクをクリックし、企業アプリケーション(SSO対象)へ遷移するのですが、
1.遷移時に、SSOデータベースを調べて、アカウント登録がされていなければ、「アカウント情報の入力」画面
(※今回開発分)を表示し、事前に登録されている企業アプリケーションに対する必要項目の入力を要求する。
2.ユーザが必要項目を入力し、画面上の[OK]を押すと、SSOデータベースにアカウント情報を登録して、
企業アプリケーション(SSO対象)へ遷移する。
という動きをします。ここで、アカウント登録がされているかどうかの確認は以下のコードで実現できたのですが、
Dim iFlg As UInt32
Dim rgGetCredentialData As String() = Nothing
iFlg = UInt32.Parse("1")
Credentials.GetCredentials(iFlg, strAppName, rgGetCredentialData)
入力内容を登録する時(以下のコード)、
Credentials.SetUserCredentials(strAppName, strUser, rgSetCredentialData)
SingleSignOnException(SSO_E_ACCESSDENIED)が発生してしまいます。
ドメインのAdministratorで操作している時はエラーなく動作します。
SSOに対してどのような権限を付与、あるいは措置すれば一般ユーザでもこの処理を正常終了
させる事ができるのかがよく判らず、悩んでおります。
情報・ヒントでもかまいませんのでよろしくお願いいたします。2009年11月5日 4:29
すべての返信
-
自己レスです。情報ソースはあいかわらず何もみつけられないのですが、
Credentials.SetUserCredentials
ではなく、
Credentials.SetCredentials
を用いるようにしたところ、登録作業はできるようになりました。
最初には書かなかったのですが、元々SPS2003で動作実績のあるソースを移植しているところでした。
ですので、MOSS2007 になり、API の内部仕様が変更されたのかもしれません。
しかし、今度は
Credentials.DeleteUserCredentials
が動きません。Deleteには
Credentials.DeleteCredentials
という API がないので、この機能は実現できなくなるのかも。。。orz2009年11月5日 8:11 -
情報として、その他に私が試したことを追記しておきます。
http://support.microsoft.com/default.aspx/kb/306158/ja
を参考に、SetUserCredentials を呼び出す前に偽装を行ってみたところ、今度は SSO_E_CANARY_VALIDATION_FAILURE が発生しました。
CanarayChecker.AddCanary の呼び出し位置を変えたりしてみたのですが、無理でした。2009年11月5日 8:13 -
http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.portal.singlesignon.credentials.aspx
このクラスおよびそのメンバは内部使用のために予約されており、ユーザー コード内で使用することを意図したものではありません。
上記のようにあるので、基本的にはアウトだと思いますが。。。
ちなみに 2003 の SDK にはそのような記述が書いてないので、セキュリティ的なデザインチェンジなのかな。2009年11月5日 16:41 -
ドアラさま
書き込みありがとうございました。
やや急ぎの状態でもありましたので、上長判断により結局 MS にも問い合わせをかけました。すると、
>上記のようにあるので、基本的にはアウトだと思いますが。。。
>ちなみに 2003 の SDK にはそのような記述が書いてないので、セキュリティ的なデザインチェンジなのかな。
まさに同じような回答が返ってきました。(^^
でこの時 ConsoleApplication での実行案も回答でもらったので(最も推奨する解決案はカスタムSSOプロバイダの作成
との事でしたが)、
とりあえずの回避策として、ASP.NET から偽装アカウントで ConsoleApplication を呼び出し、ConsoleApplication 内で、
Credentials.DeleteUserCredentials を使うという手法にしてみました。
結果うまく実行できそうです(現在テスト中です)。2009年11月8日 6:07