2015-07-02 23 views
6

Taşıyıcı jetonlarıyla owin kimlik doğrulaması kullanan bir Web api'im var. Kimlik doğrulanırken resim dosyalarını api'den sormak zorunda olan hem web hem de wpf (vb) istemcilerim olacaktır. Resimler, kimliği doğrulanmamış isteklerde iade edilmemelidir.Kimlik doğrulaması yapılırken web api denetleyici eyleminden görüntü döndürme

Şimdiye kadar doğrulanmış olmasa da bir görüntü dönen bir çalışma çözüm vardır:

Benim denetleyicisi C# eylemi:

//[Authorize] 
public HttpResponseMessage GetFile() 
{ 
    string localFilePath = "C:/Path/ImageOnServerDisk.png"; 

    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); 
    response.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read)); 
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
    response.Content.Headers.ContentDisposition.FileName = "myImage.png"; 
    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png"); 

    return response; 
} 

Ve bu web istemci üzerinde görüntülemek nasıl:

<img src="/api/Secure/GetFile" id="img" /> 

Bu iyi çalışıyor, ancak tabi ki yukarıdaki eylemde yetki özniteliğini kaldırdığımda, resim dosyası gösterilmiyor ve 401 (Yetkisiz) iletisi aldım. GetFile eylemi için ileti çağrısı alın. Bunun nedeni, GET isteğinde erişim belirtecinin olmamasıdır.

ajax ile GET için jQuery kullanmak olabilir, ama bir img öğesine sonucu nasıl ayarlanacağını bilmiyorum.

Ben de bir img src bir eylem çağrısında http GET isteği için erişim simgesi ayarlayabilir veya jQuery img öğesine görüntü içeriğini ayarlayabilirsiniz nasıl

? Ya da tamamen bunu yapmak için daha iyi bir yolu var mı?

+0

şudur: API denetleyicisi için kod aşağıda deneyebilirsiniz * öznitelik. Eylem yöntemim bir ** ApiController ** altında ve denetleyiciye işaret eden etiketlerini oluşturmaya çalışıyorum, başarısız oluyor. Çünkü doğrulamak için kullanıcı bağlamı yoktur. Herhangi bir fikir? Düşünüyorum ki Aspnet.Mvc eklemem gerekecek ve bir HTTP rotası yerine normal bir rota kaydedeceğim. – Nexus

cevap

6

ben "ajax GET için jQuery kullanmak" çalışacağını düşünüyorum. Jetonu istek başlığına ayarlayabiliriz. *

 var root = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; 
     var path = Path.Combine(root, "App_Data/Koala.jpg"); 

     var bytes = File.ReadAllBytes(path); 
     var base64 = Convert.ToBase64String(bytes); 

     return "data:image/jpeg;base64," + base64; 

Ve Aşağıdaki ** yetkilendirme geri getirmek, bu işe yaramazsa bazı javascript

$.ajax({ 
     url: '//localhost:882/api/image', 
     type: "GET", 
     success: function (data) { 
      $('#testimg').attr('src', data); 
      $('#testimg').attr('style', 'display: block;'); 
     } 
    }); 

pasajı Html

<img id="testimg" src="#" alt="Get from webapi" style="display: none;" /> 
+0

Bu pefectly çalışır, teşekkürler! – crazysnake

+0

you are welkom :) – hazjack

+0

Bu, bir HttpRequest oluşturduğunda, yetkilendirme üstbilgisini ayarladıktan sonra medya dosyasını GET yaparsam SADECE çalışır. Bunu yapamam, resim öğeleri oluşturuyorum ve ** src ** 'yi **/download/{file_id} ** gibi bir URL'ye ayarlıyorum. İsteğin doğrulanıp doğrulanmadığını nasıl kontrol edebilirim? Çünkü bu durumda kullanıcı bağlamı yoktur. Geçerli oturum açma kimliği bir WindowsIdentity'dir. – Nexus

İlgili konular