راحة ما بعد المكالمة باستخدام رمز المصادقة
-
20-12-2019 - |
سؤال
أحاول إرسال طلب نشر إلى SharePoint Online (موقع المصادقة المستند إلى المطالبات) من تطبيق العميل (تطبيق WPF).في هذه الحالة، يجب أن يكون تحديثًا لعنصر القائمة لتغيير "العنوان" إلى "اختبار".
أقوم باسترداد CookieContainer عبر فئة MsOnlineClaimsHelperوالذي يعيد لي رمز المصادقة بنجاح.
لكن عندما أحاول إرسال الطلب يكون الرد The remote server returned an error: (403) Forbidden.
رمز طلب الويب
try
{
var claimshelper = new MsOnlineClaimsHelper(baseUrl, _userName, _password);
var request = (HttpWebRequest)WebRequest.Create(baseUrl + "/" + url);
request.CookieContainer = claimshelper.CookieContainer;
request.Method = "POST";
request.Headers.Add("X-HTTP-Method", "MERGE");
request.Headers.Add("If-Match", "*");
request.Accept = "application/json;odata=verbose";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
}
var webResp = request.GetResponse() as HttpWebResponse;
var theData = new StreamReader(webResp.GetResponseStream(), true);
string payload = theData.ReadToEnd();
}
catch (Exception ex)
{
}
رابط الراحة:
/_api/lists/getbytitle('SampleList')/items(1)
حمولة Json:
string json = "{ '__metadata': { 'type': 'SP.Data.SampleListListItem' }, 'Title': 'Test'}";
خطأ:
The remote server returned an error: (403) Forbidden.
المحلول
يحدث هذا الخطأ منذ خدمة SharePoint 2013 REST يتطلب المستخدم ليشمل أ Request Digest
القيمة مع كل create
, update
و delete
عملية.يتم بعد ذلك استخدام هذه القيمة بواسطة SharePoint لتحديد الطلبات غير الحقيقية.
كيفية توفير قيمة ملخص الطلب
في MsOnlineClaimsHelper class
(MsOnlineClaimsHelper.cs
file) أضف الطريقة التالية لطلب قيمة ملخص النموذج:
/// <summary>
/// Request Form Digest value
/// </summary>
/// <returns></returns>
private string GetFormDigest()
{
var endpoint = "/_api/contextinfo";
var request = (HttpWebRequest) WebRequest.Create(_host.AbsoluteUri + endpoint);
request.CookieContainer = new CookieContainer();
request.Method = "POST";
//request.Accept = "application/json;odata=verbose";
request.ContentLength = 0;
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
var result = reader.ReadToEnd();
// parse the ContextInfo response
var resultXml = XDocument.Parse(result);
// get the form digest value
var e = from e in resultXml.Descendants()
where e.Name == XName.Get("FormDigestValue", "http://schemas.microsoft.com/ado/2007/08/dataservices")
select e;
_formDigest = e.First().Value;
}
}
return _formDigest;
}
و FormDigest
ملكية:
private string _formDigest;
public string FormDigest
{
get
{
if (_formDigest == null || DateTime.Now > _expires)
{
return GetFormDigest();
}
return _formDigest;
}
}
كيفية إجراء عملية تحديث لعنصر القائمة باستخدام SharePoint 2013 REST API
يوضح المثال التالي كيفية إجراء تحديث لعنصر قائمة باستخدام التطبيق المتوفر لطلب ملخص النموذج
النقاط الرئيسية:
X-RequestDigest
يتم استخدام الرأس لتحديد قيمة ملخص النموذج- طلب
Content Type
يجب أن يتم تحديدها
مثال:
var userName = "username@contoso.onmicrosoft.com";
var password = "password";
var payload = "{ '__metadata': { 'type': 'SP.Data.TasksListItem' }, 'Title': 'New Tasl'}"; //for a Task Item
try
{
var claimshelper = new MsOnlineClaimsHelper(baseUrl, _userName, _password);
var request = (HttpWebRequest)WebRequest.Create(baseUrl + "/" + endpointUrl);
request.CookieContainer = claimshelper.CookieContainer;
request.Headers.Add("X-RequestDigest", claimshelper.FormDigest);
request.Method = "POST";
request.Headers.Add("X-HTTP-Method", "MERGE");
request.Headers.Add("If-Match", "*");
request.Accept = "application/json;odata=verbose";
request.ContentType = "application/json;odata=verbose";
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(payload);
writer.Flush();
}
var response = request.GetResponse() as HttpWebResponse;
//...
}
catch (Exception ex)
{
//Error handling goes here..
}