سایه دانش

فعلا بدون توضیح

سایه دانش

فعلا بدون توضیح

آیاامکان اجرای متدsingle sign on بروی برنامه های قدیمی وجوددارد؟

سلام

single sign on یک روش خوب برای اجرای برنامه های داخل سازمان است به نحوی که پرسنل سازمان مجبور به ،به خاطر سپردن نام کاربری و کلمه عبور های مختلف نباشند . در این روش فقط کافی است به اکتیو دایرکتوری شبکه خود (معمولا کاربرانی که از ویندوزهایی که متصل به دومین هستند ، در ابتدای ورود به ویندوز نام کاربری و کلمه عبور دومین را وارد میکنند) وارد شده و از آن پس هر کجا نام کاربری یا کلمه عبوری لازم بود از A.D احراز هویت میشوند.


ولی مشکلی که وجود دارد این است که بعضی از برنامه های کاربردی تحت شبکه(مخصوصاً نسخه های قدیمی) از single sign on پشتیبانی نمیکند برای مثال Oracle Form Runtime 6i که یک برنامه برای نمایش فرمهای ساخته شده و اجرای برنامه هایی که با Oracle Developer تهیه گردیده میباشد از این مدل پشتیبانی نمیکند .


برای اینکه اجرای Oracle Form Runtime با استفاده از نام کاربری A.D باشند من مجبور شدم یک روش ابتکاری انجام بدهم ...


اول یک یوزر در دیتابیس اوراکل به ترتیب زیر ایجاد کردم:


CREATE USER "SSO"    IDENTIFIED BY "SSO@MIS";


بعد در اسکیمای کاربر اصلی برنامه جدول زیر را ساختم :


CREATE TABLE "SSO_USER" ("USER_NAME" VARCHAR2(20 byte)

    NOT NULL, "PASS" VARCHAR2(20 byte), "LOGIN_NAME" VARCHAR2(20 

    byte) NOT NULL, 

    CONSTRAINT "SSO_USER_PK" PRIMARY KEY("LOGIN_NAME") );

البته لزومی ندارد که این جدول در اسکیمای کاربر دیگری باشد این مورد فقط یک نکته امنیتی دارد که اگر نام کاربری و کلمه عبور SSO افشا شود این کاربر قادر به تغییر ، ایجاد و یا حذف رمزها نخواهد بود.


سپس دستور زیر را برای دسترسی کاربر SSO به جدول SSO_USER صادر میکنیم


GRANT CONNECT TO SSO;

GRANT SELECT ON SSO_USER TO SSO;


لازم به ذکر است که جدول ما سه ستون دارد ،  ستونهای USER_NAME و PASS  نام کاربری و کلمه عبور پرسنل است که در اوراکل تعریف شده و ستون LOGIN_NAME نام کاربری در A.D میباشد.

حالا بعنوان نمونه یک کاربر در جدول خود ایجاد میکنیم (با فرض اینکه کاربر HAMID با کلمه عبور HAMID@123 در دیتابیس اوراکل قبلا تعریف شده و دسترسی های لازم به آن اعطا شده باشد)

INSERT INTO SSO VALUES ('HAMID','HAMID@123','ADHAMID');

COMMIT;

ADHAMID نام کاربری مورد نظر در A.D است که آن هم قبلا در A.D تعریف شده است.


حال قسمت دیتابیس به پایان رسید و نوبت به برنامه نویسی است!!! من با #C یک برنامه کنسول نوشتم به ترتیب زیر :


string domain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName.ToUpper();

            string hostName =System.Net.Dns.GetHostName().ToUpper();

            string pass;

            string user_name;

            if (domain != "TEST.ORG")

            {

                Console.WriteLine("You must login with test.org domain.");

                Console.ReadLine();

                return;

            }


این قسمت چک میکند که پرسنل حتما به A.D و در اینجا دامین test.org لاگین کرده باشد.


System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();

            System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand();

            System.Data.OleDb.OleDbDataReader dr ;

            conn.ConnectionString = "Provider=msdaora;Data Source=mis;User Id=sso;Password=sso@mis;";

            cmd.Connection = conn;

            cmd.CommandText = "select user_name,pass from ymis_dba.sso_user where login_name='" + hostName + "'";

            try

            { conn.Open(); }

            catch 

            {

                   Console.WriteLine("Could not connect to database ...");

                   Console.ReadLine();

                    return;

            }

            dr = cmd.ExecuteReader();


در قسمت فوق نیز برنامه به دیتابیس مورد نظر وصل و نام و کلمه عبور اوراکلی فرد مورد نظر را استخراج میکند.

حال به قسمت انتهایی داستان میرسیم که آن هم اجرای برنامه Oracle Form Runtime به همراه پارامتری های نام کاربری و کلمه عبور میباشد:


            if (dr.HasRows)

            {

                dr.Read();

                user_name = dr.GetString(0);

                pass = dr.GetString(1);

                System.Diagnostics.ProcessStartInfo p = new System.Diagnostics.ProcessStartInfo();

                p.FileName = "d:\\orant\\bin\\ifrun60.exe";

                p.Arguments = "main_f.fmx" + " " + user_name + "@mis/" + pass;

                p.WorkingDirectory = @"c:\mis\share_form";

                try

                {

                    System.Diagnostics.Process.Start(p);

                }

                catch

                {

                    Console.WriteLine("Error ...");

                    Console.ReadLine();

                    return;

                }

در پایان قابل ذکر است که این روش اصلا برای برنامه هایی که SSO را پشتیبانی میکنند قابل توصیه نیست به دلیل آنکه مکانیزم SSO روشی بسیار امن برای اجرای برنامه میباشد .


نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد