سؤال

أرغب في الانتقال إلى صفحة في تطبيق ويب من تطبيق سطح المكتب. "لا مشكلة" ، أسمعك تقول ، "ما عليك سوى إطلاق المتصفح الافتراضي مع عنوان URL الصحيح". ومع ذلك ، يستخدم تطبيق الويب مصادقة نماذج ASP.NET ، ولا يرغب المستخدمون في رؤية صفحة تسجيل الدخول لأنهم قد تمت مصادقة بالفعل مع نفس بيانات الاعتماد في تطبيق سطح المكتب.

هذا يبدو بسيطًا بما فيه الكفاية ، كل ما علي فعله هو انبعاث منشور HTTP من تطبيق سطح المكتب مع هذا مزيف Postback من صفحة تسجيل الدخول إلى تطبيق الويب. سيقوم تطبيق الويب بعد ذلك بتعيين تذكرة المصادقة الخاصة به وملفات تعريف الارتباط لحالة الجلسة ، وإعادتها إلي ، وسأقوم بتخزينها في متجر IE Cookie. يمكنني بعد ذلك الانتقال إلى الصفحة المطلوبة وسيعتقد تطبيق الويب أنه تم مصادقته بالفعل.

لدي بعض شفرة العمل التي تقوم ببناء منشور HTTP ، ويرسلها ، وتحصل على استجابة صالحة تحتوي على ملفات تعريف الارتباط الصحيحة. ومع ذلك ، لا يمكنني رؤية كيفية كتابتها في متجر IE Cookie. يمكن لأي شخص لي نقطة في الاتجاه الصحيح؟

عينة من الرموز:

var requestUrl = Properties.Settings.Default.WebsiteLoginPageUrl;

var requestEncoding = Encoding.GetEncoding(1252);

// Simulated login postdata
var requestText = string.Format(
    "__VIEWSTATE={2}&__EVENTTARGET={3}&__EVENTARGUMENT={4}&__EVENTVALIDATION={5}&userNameText={0}&passwordText={1}&submitButton=Log+In",
    HttpUtility.UrlEncode(Properties.Settings.Default.UserName),
    HttpUtility.UrlEncode(Properties.Settings.Default.Password),
    Properties.Settings.Default.FakeViewState,
    Properties.Settings.Default.FakeEventTarget,
    Properties.Settings.Default.FakeEventArgument,
    Properties.Settings.Default.FakeEventValidation);

var request = (HttpWebRequest) WebRequest.Create(requestUrl);
request.Method = "POST";
request.Accept = "*/*";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = requestEncoding.GetByteCount(requestText);
request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
request.AllowAutoRedirect = false;
request.KeepAlive = false;
request.CookieContainer = new CookieContainer();

using(var writer = new StreamWriter(request.GetRequestStream(), requestEncoding)) {
    writer.Write(requestText);
}

var response = (HttpWebResponse) request.GetResponse();

// TODO: Grab the response cookies and save them to the interactive desktop user's cookie store.

Process.Start(new ProcessStartInfo {
    FileName = Properties.Settings.Default.WebsiteTargetPageUrl,
    UseShellExecute = true,
});
هل كانت مفيدة؟

المحلول

تحتاج إلى استدعاء غير المدير internetsetcookie () وظيفة. وانظر! شخصا ما كتب interop لك بالفعل. يجب أن تتحقق من صوابها رغم ذلك.

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