none
Resimlerin yayınlandığı klasöre yetkisiz girişi engellemek.

    Soru

  • Merhaba;

    Yaptığım bir MVC projesinde siteye sadece yetkili kullanıcılar girebiliyor.

    Kullanıcı girişi yaptıktan sonra slider da bazı resimler gösteriyorum.

    Bu resimleri sadece giriş yapan kullanıcının görmesi gerekiyor.

    siteadi.com/Resimler/resim1.png şeklinde tarayıcıya url yazılırsa kullanıcı girişi yapsın ya da yapmasın resmi görüntüleyebiliyor.

    Bunu sadece kullanıcı girişi yapanların görmesini nasıl sağlayabilirim.

    -----2. olarak

    Bu işlemi images.alanadi.com gibi bir subdomain de yayınlarsam burayıda sitede oturum açarsa görmesini istiyorum.

    Böyle birşey mümkünmü.

    Mümkünse nasıl yapabilirim.

    Şimdiden teşekkürler.

    19 Haziran 2017 Pazartesi 10:09

Yanıtlar

  • suleyman yalcin yanıtınız için teşekkürler.

    web.config dosyasında kullanmak istedim ama ben AspNet'in yetkilendirmesini kullanıyorum ve Forms bazlı yetkilendirme kullanmıyorum bu ayar bende None oyüzden web.config üzerinden olmuyor.

    --

    Bende mvcde ki routing yapısı ile çözdüm.

    Aynı sorunu yaşayanlar için işlemler aşağıdadır.

    İlk olarak App_Start klasöründe ki RouteConfig.cs dosyasında ki RegisterRoutes metodunun içine aşağıdaki yönlendirmeyi ekliyoruz.

    public static void RegisterRoutes(RouteCollection routes)

    {

    MapRoute( "ResimGoruntule", //Her MapRoute için yazılan benzersiz addır. Ben Dosya isimli Controller da ki Action adını yazdım. "dosya/resim/stok/{stokKodu}/{resimAdi}", //Kendinize göre belirleyeceğiniz sanal resim yoludur. new { Controller = "Dosya", action = "ResimGoruntule", resimAdi = (string)null } );

    //Aşağıda ki şekilde adres saturuna veya img tagının src özelliğine yazıldığında Dosya Controllerında ki

    //ResimGoruntule Action ı çalışır eğer oturum açmadıysa resmi görüntüleyemez ve giriş sayfasına yönlendirir.

    //www.siteadiniz.com/dosya/resim/stok/15820154/stokresmi1.jpeg

    }

    Daha sonra Dosya isimli bir Controller oluşturup içerisine aşağıda ki metodu ekleyiniz.

    [Authorize]
        public class DosyaController : MainController
        {
            public FileResult ResimGoruntule(string stokKodu, string resimAdi)
            {
                try
                {
                    string yol = @"E:\Siteler\Site1\Resimler\Stok\"+stokKodu + @"\" + resimAdi;
                    if (System.IO.File.Exists(yol))
                    {
                        FileStream fs = new FileStream(yol, FileMode.Open);
                        var result = new FileStreamResult(fs, "image/" + System.IO.Path.GetExtension(yol).Replace(".", ""));
    
                        return result;
                    }
                    else
                        throw new Exception();
                }
                catch
                {
                    FileStream fs = new FileStream(Server.MapPath("~/Content/images/nopicture.png"), FileMode.Open);
                    var result = new FileStreamResult(fs, "image/png");
                    return result;
                }
            }
        }

    Önemli not yönlendirmenin çalışabilmesi için web.config dosyasında aşağıdaki ayar yapılmalıdır.

    modules tagına aşağıda ki attr eklenmesi gerekiyor.(YOKSA YÖNLENDİRME ÇALIŞMAZ(dosya uzantılı olduğu için yönlendirme çalışmıyor.))

    <system.webServer>
        <!--
              Adres satırına aşağıda ki şekilde adres yazıldığında eğer giriş yapmamış ise dosyayı görüntülemesine izin verilmiyor.
              http://.../dosya/resim/stok/15217001/source.gif
              
              Bu ayarın çalışması için modules tag'ına runAllManagedModulesForAllRequests="true" attribute ü eklenmiştir.
         -->
        <modules runAllManagedModulesForAllRequests="true">
          ....
        </modules>





    20 Haziran 2017 Salı 11:53

Tüm Yanıtlar

  • Sitenin bütün dizinlerini yetkiye tabi tutabilirsin bunu web.config üzerinden yapabilirsin bunu araştır.

    2. bir yol olarak resimde olsa yapılan her isteği öncesinde global.ajax içerisinden request_start ile yakalayabilirsin ve burada ilgili isteği yapan clientin yetkisini kontrol edebilir sonuç olarak istersen yeni bir sayfaya yönlendirebilirsin.

    3. bir yol olarakta sistemdeki bütün resimlerine bir id atarsın ve direk file/resim.jpg şeklinde değilde resim/resimid şeklinde bir tasarım yaparsın resimid sine göre ilgili resmi kullanıcıya gösterirsin bu sırada tabi resim controllerını sadece giriş yapan kişilerin göreceği şekilde ayarlarsın. 

    19 Haziran 2017 Pazartesi 11:28
  • suleyman yalcin yanıtınız için teşekkürler.

    web.config dosyasında kullanmak istedim ama ben AspNet'in yetkilendirmesini kullanıyorum ve Forms bazlı yetkilendirme kullanmıyorum bu ayar bende None oyüzden web.config üzerinden olmuyor.

    --

    Bende mvcde ki routing yapısı ile çözdüm.

    Aynı sorunu yaşayanlar için işlemler aşağıdadır.

    İlk olarak App_Start klasöründe ki RouteConfig.cs dosyasında ki RegisterRoutes metodunun içine aşağıdaki yönlendirmeyi ekliyoruz.

    public static void RegisterRoutes(RouteCollection routes)

    {

    MapRoute( "ResimGoruntule", //Her MapRoute için yazılan benzersiz addır. Ben Dosya isimli Controller da ki Action adını yazdım. "dosya/resim/stok/{stokKodu}/{resimAdi}", //Kendinize göre belirleyeceğiniz sanal resim yoludur. new { Controller = "Dosya", action = "ResimGoruntule", resimAdi = (string)null } );

    //Aşağıda ki şekilde adres saturuna veya img tagının src özelliğine yazıldığında Dosya Controllerında ki

    //ResimGoruntule Action ı çalışır eğer oturum açmadıysa resmi görüntüleyemez ve giriş sayfasına yönlendirir.

    //www.siteadiniz.com/dosya/resim/stok/15820154/stokresmi1.jpeg

    }

    Daha sonra Dosya isimli bir Controller oluşturup içerisine aşağıda ki metodu ekleyiniz.

    [Authorize]
        public class DosyaController : MainController
        {
            public FileResult ResimGoruntule(string stokKodu, string resimAdi)
            {
                try
                {
                    string yol = @"E:\Siteler\Site1\Resimler\Stok\"+stokKodu + @"\" + resimAdi;
                    if (System.IO.File.Exists(yol))
                    {
                        FileStream fs = new FileStream(yol, FileMode.Open);
                        var result = new FileStreamResult(fs, "image/" + System.IO.Path.GetExtension(yol).Replace(".", ""));
    
                        return result;
                    }
                    else
                        throw new Exception();
                }
                catch
                {
                    FileStream fs = new FileStream(Server.MapPath("~/Content/images/nopicture.png"), FileMode.Open);
                    var result = new FileStreamResult(fs, "image/png");
                    return result;
                }
            }
        }

    Önemli not yönlendirmenin çalışabilmesi için web.config dosyasında aşağıdaki ayar yapılmalıdır.

    modules tagına aşağıda ki attr eklenmesi gerekiyor.(YOKSA YÖNLENDİRME ÇALIŞMAZ(dosya uzantılı olduğu için yönlendirme çalışmıyor.))

    <system.webServer>
        <!--
              Adres satırına aşağıda ki şekilde adres yazıldığında eğer giriş yapmamış ise dosyayı görüntülemesine izin verilmiyor.
              http://.../dosya/resim/stok/15217001/source.gif
              
              Bu ayarın çalışması için modules tag'ına runAllManagedModulesForAllRequests="true" attribute ü eklenmiştir.
         -->
        <modules runAllManagedModulesForAllRequests="true">
          ....
        </modules>





    20 Haziran 2017 Salı 11:53