locked
SSO 登録時に SSO_E_ACCESSDENIED RRS feed

  • 質問

  • いつも助けていただいています。

    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 がないので、この機能は実現できなくなるのかも。。。orz

    2009年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