Asp.Net MVC 5 Web Servise Farklı Platformlardan Yetkili Bağlanma ve POST İşlemi

Restfull Web Api için yetkilendirme yapılmadığı durumlarda bağlanan herkes için açık olacaktır. Bunun önüne geçmek için yetkilendirme yapılması gerekir. Örneğin sıcaklık ve nem bilgisini veritabanına kaydeden bir web servis yazmak için önce modeli oluşturuyoruz.


public class Record
{
	public int Id { get; set; }
	public double Temp { get; set; }
	public double Hum { get; set; } 
}

Modeli veritabanında oluşturduktan sonra Controllers klasörü altına Api isminde bir klasör oluşturup içerisine Web Api 2 denetleyicisi ekliyoruz.


public class RecordController : ApiController
   {
       private ApplicationDbContext _context;
       public RecordController()
       {
           _context = new ApplicationDbContext();
       }
 
       [Authorize]
       [HttpPost]
       public IHttpActionResult Save(Record record)
       {
           if (record == null) return NotFound();
 
           Record newRecord = new Record
           {
               Temp = record.Temp,
               Hum = record.Hum
           };
           _context.Records.Add(newRecord);
           _context.SaveChanges();
           return Ok();
       }
   }

Global.asax dosyasına WebApi kaydı yapıyoruz.

GlobalConfiguration.Configure(WebApiConfig.Register);

Normalde bu Web Servise veri gönderilmeye çalışıldığında Authorize ifadesi olduğu için isteği giriş sayfasına gönderecektir. Bunu aşabilmek için giriş yetkisine sahip bir bilet üretim bunu post ile birlikte göndermemiz gerekir. Bunun için önce Projeye Saglayici isminde bir klasör ekliyoruz. Bu klasör içerisine YetkiSaglayici sınıfını oluşturuyoruz.

public class YetkiSaglayici : OAuthAuthorizationServerProvider
   {
       public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
       {
           var denetim = context.OwinContext.GetUserManager<ApplicationUserManager>();
 
           ApplicationUser kullanici = await denetim.FindAsync(context.UserName, context.Password);
 
           if (kullanici == null)
           {
               context.SetError("yetkisiz", "Kullanıcı adı veya şifre hatalı.");
               return;
           }
 
           ClaimsIdentity kullaniciKimlik = await kullanici.GenerateUserIdentityAsync(denetim);
           ClaimsIdentity kullaniciCookie = await kullanici.GenerateUserIdentityAsync(denetim);
 
           AuthenticationProperties ozellikler = CreateProperties(kullanici.UserName, kullanici.Id);
           AuthenticationTicket bilet = new AuthenticationTicket(kullaniciKimlik, ozellikler);
           context.Validated(bilet);
           context.Request.Context.Authentication.SignIn(kullaniciCookie);
       }
 
       public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
       {
           if (context.ClientId == null)
           {
               context.Validated();
           }
           return Task.FromResult<object>(null);
       }
       public static AuthenticationProperties CreateProperties(string userName, string Id)
       {
           IDictionary<string, string> data = new Dictionary<string, string>
          {
              { "userName", userName }, { "UserId", Id }
          };
           return new AuthenticationProperties(data);
       }
 
   }

Şimdi paket yönetici konsolundan Owin kütüphanesi yüklenmelidir.

Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.2.7

Daha sonra WebApiConfig.cs dosyasına aşağıdakiler eklenir.

config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

Daha sonra Startup.Auth.cs dosyasını açıp aşağıdakiler eklenir.


public static OAuthAuthorizationServerOptions YetkiOzellikleri { get; private set; }
        public Startup()
        {
            YetkiOzellikleri = new OAuthAuthorizationServerOptions
            {
                // Bilet almak için Url nasıl kullanılacak
                TokenEndpointPath = new PathString("/bilet"),
                // Sağlayıcı ayarlanır
                Provider = new YetkiSaglayici(),
                // Biletin geçerlilik süresi burada 1 saat yapıldı
                AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
                AllowInsecureHttp = true
            };
 
        }
public void ConfigureAuth(IAppBuilder app)
        {
…
//Aşağıdaki webapi lerde bilet alabilmek için eklendi
app.UseOAuthBearerTokens(YetkiOzellikleri);

…
}

Postman Uygulamasından Bağlanma

Bunu denemek için örneğin Postman uygulamasından kayıt eklemeye çalışalım. Öncelikle bilet alabilmek için http://localhost:50208/Bilet konumuna uygulamada yetkiye sahip kullanıcı adı ve şifreyi post ediyoruz. Aşağıdaki resimden post detayları görünebilir. Gelen cevapta bize 1 saatlik giriş için yarayacak access_token olarak verilmiş bir bilet bulunmaktadır.

Bu bileti kullanıp kaydı web servis aracılığıyla veri tabanına kaydetmeye çalışacağız. Aşağıda görüldüğü gibi Headers kısmına Authorization isminde yeni anahtar oluşturup yukarıda access_token olarak verilmiş bilgiyi başına bearer ve bir boşluk ekleyerek değer kısmına yazıyoruz.

Şimdi Body kısmına gönderilecek Json veriyi ekleyip Send diyebiliriz. Yeni veri veritabanına eklenmiş olacaktır.

Netbeans Java Uygulamasından Bağlanma

Aynı denetime sahip Asp.Net web servisine Java uygulamasından bağlanıp kayıt eklemeye çalışacağız. Önce bileti alacak sınıfı yazıyoruz. Görüldüğü üzere giriş bilgilerini post edip gelen bilet bilgisini token isimli değişkende sağlıyor.


public class Bilet {
    private String token;
    public Bilet(){
        String urlYol = "http://localhost:50208/Bilet";
        BufferedReader oku=null;
        HttpURLConnection baglanti = null;
        try{
            URL url = new URL(urlYol);
            OutputStream cikti = null;
            baglanti = (HttpURLConnection) url.openConnection();
            baglanti.setRequestMethod("POST");
            baglanti.setDoOutput(true);
            baglanti.setDoInput(true);
            baglanti.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            baglanti.setConnectTimeout(5000);
            baglanti.setReadTimeout(5000);
            String girisBilgileri = "grant_type=password&username=dene@dene.com&password=As_1234";
            cikti = baglanti.getOutputStream();
            cikti.write(girisBilgileri.getBytes());
            cikti.flush();
            if(baglanti.getResponseCode() != HttpURLConnection.HTTP_OK){
                System.err.println("Bağlantıda hata oluştu.");
                return;
            }
            InputStream is = baglanti.getInputStream();
            oku = new BufferedReader(new InputStreamReader((is)));
            String tmpStr = null;
            while((tmpStr = oku.readLine()) != null){
                ObjectMapper mapper = new ObjectMapper();
                JsonNode node = mapper.readTree(tmpStr);
                token = node.findValue("access_token").textValue();
            }
        }
        catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if(oku != null) oku.close();
                if(baglanti != null) baglanti.disconnect();               
            } catch(Exception ex){
                 
            }
        }
    }
    public String getToken(){
        return token;
    }
}

Şimdi de sıcaklık ve nem bilgisini web servise gönderecek Record sınıfını yazalım. Record sınıfından nesne üretilebilmesi için bilet, sıcaklık ve nem bilgisi gönderiliyor.


public class Record {
    public void send(String bilet,double sicaklik,double nem){
        String urlstr = "http://localhost:50208/Api/Record";
        String json = "{\"Temp\":"+sicaklik+",\"Hum\":"+nem+"}";
        int length = json.length();
        try{
            URL url = new URL(urlstr);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
            conn.setRequestMethod("POST"); 
            conn.setDoOutput(true);
            conn.setRequestProperty("Authorization", "bearer "+bilet); 
            conn.setRequestProperty("Content-Type", "application/json"); 
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            HttpURLConnection.setFollowRedirects(true); 
            conn.setInstanceFollowRedirects(false); 
            conn.setDoOutput(true); 
            OutputStream os = conn.getOutputStream();
            os.write(json.getBytes());
            InputStream ip = conn.getInputStream(); 
            BufferedReader br1 = new BufferedReader(new InputStreamReader(ip));
            os.flush(); 
            System.out.println(conn.getResponseCode());
        }
        catch(JsonProcessingException ex){
            System.out.println(ex);
        }
        catch(IOException ex){
            System.out.println(ex);
        } 
    }
}

Aşağıda da uygulamayı çalıştırmak için gerekli main metodu görülmektedir. Eğer ekrana çıktı olarak 200 kodu dönüyorsa kayıt başarıyla veritabanına eklenmiştir.


public static void main(String[] args) throws IOException {
        Bilet bilet = new Bilet();
        Record record = new Record();
        record.send(bilet.getToken(), 12, 50);
}

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir