سؤال

قد يبدو هذا مثل سؤال أساسي والعودة إلى بروتوكول HTTP 101. لكنني أواجه صعوبة في فهم كيفية عمل المصادقة الأساسية. أقوم بتنفيذ خدمة Windows وتحتاج إليها لتكون آمنة. أرغب في الحصول على اسم المستخدم وكلمة المرور ومصادقة المستخدم إلى متجر مستخدم مخصص. أريد أيضا تقليل عدد مكالمات تسجيل الدخول، حيث تمثل مكالمة تسجيل الدخول مكالمة إلى خادم SQL الخاص بنا. ما بدأت حتى الآن هو شيء مثل هذا:

الطريقة التي أراها الدالة Userauthearized لها إجراء مكالمة تسجيل الدخول المخصصة. ولكن، لا أريد أن أفعل ذلك كل مرة. هل تحتفظ المصادقة الأساسية إذا قمت بتسجيل الدخول، أو هل يوجد حل آمن مؤشر مؤشر ترابط التخزين المؤقت الذي يجب علي استكشافه.

أوه نعم، أود أيضا أن أجعله حتى يتم إنشاء المستخدم ويتم إنشاء الكائن والحفاظ عليه في مؤشر الترابط للمستمع للإشير إليه على ردود احتياطية لاحقة للمستخدم / الاتصال. ولكن بما أن Listenercallback ثابت، فأنا لست متأكدا من كيفية تحقيق ذلك.

شكرا مقدما على أي مساعدة، وأنا أقدر ذلك حقا و stackoverflow.

public void ThreadProc() {
    string uriPrefix = ConfigurationManager.AppSettings["ListenerPrefix"];
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add(uriPrefix);
    listener.AuthenticationSchemes = AuthenticationSchemes.Basic;

    listener.Start();

    Console.WriteLine("Start listening on " + uriPrefix);
    Console.WriteLine("Press Control-C to stop listener...");

    while (listening) {
        IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
        result.AsyncWaitHandle.WaitOne();
    }
}

public static void ListenerCallback(IAsyncResult result) {
    HttpListener listener = (HttpListener)result.AsyncState;
    HttpListenerContext context = listener.EndGetContext(result);
    WebDavEngine engine = new WebDavEngine(context.User);

    context.Response.SendChunked = false;
    FileLogger.Level = LogLevel.Debug;

    engine.IgnoreExceptions = false;

    if (UserAutorized(context)) {
        try {
            engine.Run(context, listener.Prefixes);
            engine.CommitTransaction();
        } catch {
            engine.RollBackTransaction();
        } finally {
            engine.CloseConnection();
        }
    } else
        context.Response.StatusCode = 401;

    if (context.Response.StatusCode == 401)
        ShowLoginDialog(context, context.Response);

    try {
        context.Response.Close();
    } catch {
        // client closed connection before the content was sent
    }
}

private static bool UserAutorized(HttpListenerContext context) {
    HttpListenerBasicIdentity identity = (HttpListenerBasicIdentity)context.User.Identity;

    if (!identity.IsAuthenticated) {
        string username = identity.Name;

        // workaround for Windows Vista Basic authentication. User name may be submitted in the following format: Machine\User.
        int ind = username.LastIndexOf('\\');
        if (ind > 0)
            username = username.Remove(0, ind + 1);


        Console.WriteLine("Trying Authentication since identity is NOT authenticated");

        return false;
    } else {
        Console.WriteLine("identity.IsAuthenticated: " + identity.IsAuthenticated.ToString());
        return identity.IsAuthenticated;
    }            
}

تعديل: +1 للوثيقة وحدها، التي فتحت حقا عيني إلى كاباريسون لخطط المصادقة وكيف يعملون. ما لم أقرأ هذا الخطأ، فهو يبدو أن مخطط هضم قد يكون قادرا على الحفاظ على "جلسة" أو على الأقل انتهاء إعادة محاولة مصادقة مخصصة.

هل كانت مفيدة؟

المحلول 2

شكرا على المواصفات، وأنا أقدرها. لقد تمكنت من حل مشكلتي ولم يكن موصولا مرتبطا بل مشكلة التصميم / الاستضافة.

نصائح أخرى

http basic. يتطلب بيانات اعتماد تسجيل الدخول مع كل طلب. لا يحتوي HTTP على أي مفهوم للجلسة، لذلك لا يمكنك معرفة ما إذا كان شخص ما "تسجيل الدخول بالفعل".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top