Nasıl güvenli bir şekilde özel WebAPİ bir HttpMessageHandler kullanıcı asıl ayarlayabilirim?
Burada bir özel HttpMessageHandler
örnek Darin Dimitrov cevabı gösterildiği dayalı uygulanan temel kimlik doğrulaması için: http://stackoverflow.com/a/11536349/270591
Kod örneği tip principal
kullanıcı adı GenericPrincipal
ve roller oluşturur ve daha sonra iş parçacığı geçerli asıl bu temel ayarlar:
Thread.CurrentPrincipal = principal;
** 10 bir yöntem daha sonra asıl denetleyicileri User
özellik: erişerek okuyabilirsiniz
public class ValuesController : ApiController
{
public void Post(TestModel model)
{
var user = User; // this should be the principal set in the handler
//...
}
}
Bu geçenlerde bir özel gibi Task
Kitaplığı kullanan MediaTypeFormatter
: katma kadar iyi çalışır gibiydi
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content, IFormatterLogger formatterLogger)
{
var task = Task.Factory.StartNew(() =>
{
// some formatting happens and finally a TestModel is returned,
// simulated here by just an empty model
return (object)new TestModel();
});
return task;
}
(Bu yaklaşım bazı örnek kod ReadFromStreamAsync
16 *ile göreve başlamak zorundayım. Bu yanlış ve belki de sorun için tek neden?)
Şimdi, "bazen" ve bunun için bana görünüyor rastgele - User
anapara denetleyicisi yöntem değil Müdür kalmadı kümesi MessageHandler, yani kullanıcı adı, Authenticated
bayrağı ve rolleri vardır. Nedeni özel MediaTypeFormatter MessageHandler ve kontrol yöntemi arasındaki bağ, bir değişiklik olur gibi görünüyor. Kumanda yöntemi MessageHandler Thread.CurrentThread.ManagedThreadId
ve değerleri karşılaştırarak bunu onayladım. "" Onlar farklı, ve asıl o zaman "". kayıp bazen
Şimdi Thread.CurrentPrincipal
bir şekilde denetleyicisi yöntemi için özel MessageHandler ıçinden güvenli bir şekilde aktarmak için ayarlamak için bir alternatif aradım ve this blog post istek özellikleri kullanılır:
request.Properties.Add(HttpPropertyKeys.UserPrincipalKey,
new GenericPrincipal(identity, new string[0]));
Sınamak istedim ama öyle görünüyor ki HttpPropertyKeys
sınıf (ad System.Web.Http.Hosting
) yok UserPrincipalKey
özellik artık son WebApi sürümleri (release candidate ve final sürümüne geçen hafta da).
Sorum şu: acaba şu anki WebAPİ sürümü ile çalışır yani son yukarıdaki kod parçacığı değiştirebilir miyim? Ya genelde: Nasıl özel MessageHandler ve bir erişim kullanıcı asıl dizi denetleyicisi güvenilir bir yöntem olabilir miyim?
Edit
here söz konusu "HttpPropertyKeys.UserPrincipalKey
... “MS_UserPrincipal”
", bu yüzden ben kullanmaya çalıştı: . çözümler için
request.Properties.Add("MS_UserPrincipal",
new GenericPrincipal(identity, new string[0]));
Ama çalışmıyor işte bunu bekliyordum: ApiController.User
özellik asıl yukarıda Properties
koleksiyona içermiyor.
CEVAP
Yeni bir konu üzerinde anapara kaybetme sorunu burada bahsedilen:
http://leastprivilege.com/2012/06/25/important-setting-the-client-principal-in-asp-net-web-api/
Önemli: Ayar ASP.NET Web API İstemci Müdür
Bazı talihsiz mekanizmaları ASP.NET ayar derinliklerinde gömülü nedeniyle İplik.Web API web hosting CurrentPrincipal yeterli değil.
ASP.NET, İplik ev sahipliği yaparken.CurrentPrincipal geçersiz olabilir HttpContext.Mevcut.Yeni bir iş parçacığı oluşturma, kullanıcı. Bu demektir iplik ve HTTP içerik hem de Müdür ayarlamak gerekir.
Ve burada: http://aspnetwebstack.codeplex.com/workitem/264
Bugün, kullanıcı asıl için aşağıdakilerin her ikisini de ayarlamak gerekir eğer özel bir ileti kimlik doğrulaması gerçekleştirmek için işleyicisi kullanırsanız web senaryoya ev sahipliği yaptı.
IPrincipal principal = new GenericPrincipal( new GenericIdentity("myuser"), new string[] { "myrole" }); Thread.CurrentPrincipal = principal; HttpContext.Current.User = principal;
Ben eklenen son satır HttpContext.Current.User = principal
(ihtiyacı var using System.Web;
) ileti işleyicisi ve User
özelliği ApiController
yaptığı her zaman doğru asıl Şimdi bile konu değişti nedeniyle görev MediaTypeFormatter.
Edit
Sadece bunu vurgulamak için: HttpContext
geçerli kullanıcı asıl Ayar WebApi asp.net/iis içinde bulunan zaman gereklidir. Kendi kendine ev sahipliği için gerekli (ve olası HttpContext
kendi kendine barındırılan bir ASP.NET oluşturmak ve yok çünkü).
Nasıl S3 veri deposu ve raylar API / i...
Nasıl benim kullanıcıların store'...
Nasıl TÜM özel durumları genel# MVC4 C...
Güvenli bir şekilde C zaman uyumsuz yö...
Önleme ilk şansını özel durum güvenli ...