SORU
19 AĞUSTOS 2012, Pazar


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
19 AĞUSTOS 2012, Pazar


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ü).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • PomplamooseMusic

    PomplamooseM

    28 HAZİRAN 2008