Başka bir veritabanından bazı verilere dayanarak bir dizi duyuru oluşturmak için bir müşteri isteğim var. Birçoğu yeterince kolay görünüyor ama yeni öğeler giriş verilerinde belirtilen kullanıcı (giriş) tarafından oluşturulmalıdır. Duyuruları liste web hizmetlerini kullanarak eklemeyi planlıyorum, ancak oluşturma kullanıcısını doğru şekilde kullanabilmek için kimliğe bürünme yönteminden kaçınmak isterim. Kimliğe bürünme özelliğini kullanmadan doğru kullanıcıyı içerik oluşturucu olarak atamanın bir yolu var mı?Belirli bir kullanıcı için bir duyuru listesine eleman ekleme
cevap
Aradığınız yanıt bu olmayabilir, ancak bir SharePoint sunucusunda GAC'de kodunuz varsa, kimliğe bürünme oldukça kolaydır. Pek çoğunun fark etmediği herhangi bir şifreyi bilmenize gerek yok, bu yüzden bu kişinin kimliğe bürünme yapmak istemediğin nedeni olduğunu varsaymaya devam edeceğim. İşte nasıl yapılacağı.
SPSite için kullandığınız tipik kurucu kullanarak SharePoint'e bağlanabilir ve uygun SPUser nesnesini bulabilirsiniz. Bunu yaptıktan sonra, o SPUser için UserToken özelliğini alabilirsiniz. Daha sonra SPSite kurucusunu tekrar kullanmanız gerekir, ancak SPUserToken'i sağlayan aşırı yüklemeyi kullanın. Sonra SharePoint'te yaptığınız her şey, kimliğe bürünme yoluyla yapılacaktır. Yüksek ayrıcalıklarla koşmaya gerek yok.
Tamam, şimdi bunu kelimelerle söyledim, kodda tahmin etmeye çalışacağım.
kullanıcı siteyi en az bir defa ziyaret etmemişse eğer, cevabım kod açıklamalarda değinildiği üzere// Just determine the user token for a particular user
SPUserToken userToken = null;
using (SPSite tempSite = new SPSite("http://sharepointurl"))
{
using (SPWeb tempWeb = tempSite.OpenWeb())
{
// I think this next line works, but I'm going from memory
// I believe the user needs to have already logged into the site at least once
SPUser user = tempWeb.AllUsers["username"];
userToken = user.UserToken;
}
}
// Now do whatever we want impersonating that user
using (SPSite site = new SPSite("http://sharepointurl", userToken))
{
using (SPWeb web = site.OpenWeb())
{
// Do whatever you want here
}
}
Bunu arşivlemek için bir yöntem olduğunu sanmıyorum.
Ancak bu geçici çözüm yardımcı olabilir. Bunu asla test etmediğimi itiraf etmeliyim, problemini nasıl çözebileceğin sadece bir fikir.
Bunu deneyebilirsiniz. Bir yönetici kullanıcıyla veya RunWithElevatedPrivileges() ile yeni duyuruyu oluşturun. Bundan sonra RunWithElevatedPrivileges() yöntemini tekrar kullanın ve "yaratılan" alanını, duyurunun asıl yaratıcısı olması gereken kullanıcıya ayarlayın. Bu şekilde sadece "düzenlenmiş" alanı "yanlış" kullanıcıyı göstermelidir.
Bunun çok zarif bir çözüm olmadığını biliyorum ama işe yarayabilir. Bir ekledi:;)
Sadece benim gereksinimi bu yüzden emin başka çözüm geldi
:-) bu yapılamaz umuyoruz SharePoint denetim izi atlatmak için aslında olduğunu fark etti Duyuru listesine yeni kullanıcı veya grup alanı ekleyin ve AD-kullanıcı oturumunu bu alana kopyalayın. Önceden "oluşturulan" alanını kullanan herhangi bir rapor veya görünüm şimdi yeni alanı kullanmalıdır.Gerçek bir kullanıcının, duyuru listesinde yeni bir öğeye girdiği duruma ne dersiniz? Bu yeni alan giriş yapmış kullanıcı ile güncellenmez!
Pekala, gelebileceğim tek çözüm, listeye bir ListItem Add Trigger eklemek. Yeni bir öğe eklendiğinde, yeni alanın bir değer içerip içermediğini kontrol edip, yeni alanı oturum açmış kullanıcının kimliğiyle güncelleyemiyorum. Bu şekilde, yeni alan her zaman geçerli bir kullanıcı kimliği içermelidir.
Bunun zarif bir çözüm olmadığını biliyorum, ancak şimdilik düşünebileceğim en iyisi.
, düzgün bir usertoken türetmek için kullanılabilecek başka hiçbir kullanıcı meta vardır: Bu gibi bir şey olmalıdır.Bu ilginç görünüyor Şimdi
SPUser alice = web.EnsureUser(@"MYDOMAIN\alice");
SPList userInfo = web.SiteUserInfoList; //metadata storage of user info
SPListItem item = userInfo.GetItemById(alice.ID);
item["About Me"] = "I am Alice from Mel's Diner";
item.Update();
:
SharePoint 2010 ile, SPWeb sınıfından mevcut EnsureUser yöntemiyle kullanıcı ziyareti, (bu pasajı kullanıcıyı oluşturur ve ayrıca profil biraz tweaks) simülasyonunu yapabilirsiniz. Ben bunu deneyeceğim ve – Kasper
Kirk'i geri döndüreceğim, hayrete düştüm. Önerdiğiniz fikir harika çalışıyor, ancak öncelikle denetim izinin geçerliliğinin geçersiz olması nedeniyle bunu büyük bir savunmasızlık olarak gördüm. İkinci düşüncede, bu "istismar" ı kullanabilmek için düşman kodunun sistem özüne erişmesi gerektiğini fark ettim. – Kasper
Evet, bu boşlukların orada olduğunu öğrendiğimde çok şaşırdım. Dediğiniz gibi, kodunuzun belirli kod erişim güvenlik düzeylerine sahip olması gerekir (GAC'de iş yapmak elbette ki), bu yüzden bunu tamam yapar :-). Bir başka ilginç olan SPListItem.SystemUpdate(). –