0

私は会社で多くの社内アプリケーションを構築してきました。そして、私のプログラミングはデータベース/アプリ レベルです。私のアプリケーションのほとんどは、同じログイン/認証クラスを何年も使用しています。ただし、この会社は、すべてが SSO 認証アプリケーションを通過することを望んでいます。SSO アプリケーションの URL、渡されるフィールド名、サイトの actionURL、appKey が送られてきました。

私のアプリケーションはすべて同じドメインにあります。ドメイン全体で動作するように Cookie を設定し、それを設定できることを理解しています。非常に単純なテストコードを書いたので、今は少し行き詰まっています。ユーザーをSSOサーバーに連れて行き、認証して、ドメインのルートであるactionURLに送り返します。

コードの背後にある URL をリクエストしようとすると、認証が必要であることが示され、SSO アプリに渡され、actionURL に戻されます。アプリをナビゲートするには、actionURL に何が必要ですか。

現在のコード:

session_start();

if ($_POST && isset($_POST['digest']))       
{
    $digest = $_POST["digest"];
    // set the session variables ...

    $_SESSION['username'] = $_POST["firstname"]." ".$_POST["lastname"];
    $_SESSION['firstname'] = $_POST["firstname"];
    $_SESSION['lastname'] = $_POST["lastname"];
    $_SESSION['email'] = $_POST["email"];
    $_SESSION['uid'] = $_POST["uid"];


    // Needed for key
    $uid = $_POST["uid"];
    $time = $_POST["time"];

    // Read the property file with the key and URL  so this won't go into the main code ...
    // this sets $appKey and $safeurl

    require_once("safe_login_properties.php");

    $mykey = "".$uid.$time.$appKey;
    $mydigest = md5($mykey);



    if ($debugthis)    // enable this for some debugging
    {
        $fp = fopen("DebugInfo.txt", "a");
        fprintf($fp, "%s\n", date("H:i:s"));

        foreach($_POST as $p => $v)
        {
            fprintf($fp, "POST: %s: %s\n", $p, $v);
        }
        foreach($_SESSION as $p => $v)
        {
            fprintf($fp, "SESSION: %s: %s\n", $p, $v);
        }

        fprintf($fp, "mykey: %s (uid: %s, time %s, key %s)\n", $mykey, $uid, $time, $appKey);
        fprintf($fp, "posted digest: %s\n", $digest);
        fprintf($fp, "mydigest: %s\n", $mydigest);

        if ($digest == $mydigest)
            fprintf($fp, "Digest match\n");
        else
            fprintf($fp, "***** digest does not match\n");
        fclose($fp);
    }

    if ($digest != $mydigest)
    {
       die("Invalid login - expected digest does not match");
    }

}

if (!isset($_SESSION['username']) || empty($_SESSION['username']))
{
    // Read the property file with the key and URL  so this won't go into the main code ...
    // this sets $appKey and $safeurl
    require_once("safe_login.php");
    header("Location: ".$safeurl);
}

追加情報 - 私のアプリケーションはすべて mysql と php ベースです。そのため、mysql の一部をその中に持ち込む必要があります。はい、あなたは承認されています。ユーザー名は渡されました。次に、mysql データベースであなたを検索し、対応する行を使用して権利/アクセスを取得します。それは理にかなっていますか?その部分を今書いてみました。

4

1 に答える 1

0

あなたの場合、MySQL データベースのユーザーと SSO サーバーの間にマッピングが必要です。簡単なものはメールアドレスです。より良いのは、グローバルに一意の ID である GUID です。それが何であれ、SSO サーバーは actionURL (SSO 用語では... コールバック URL) を呼び出すときに、ユーザーを識別する一意の ID を渡す必要があります。

一意の ID を取得したら、その ID を使用して MySQL DB からユーザーを取得します。彼が存在する場合は、ログインします。

通常、SSO サーバーは、アプリケーションが参照できる Cookie を作成します。これは、ユーザーがログインしているかどうかを示す必要があります (そのため、サーバーに戻ってユーザーを認証する必要はありません)。

HTH

于 2013-04-22T19:28:51.940 に答える