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);
}