„Integrált információs rendszerek labor br Web Service .NET alapon” változatai közötti eltérés

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
(Új oldal, tartalma: „{{GlobalTemplate|Infoszak|IIRLaborWS}} * 2006 * 2007-ben is ugyanaz volt a labor menete, csak a WS kódja változott picit, meg a ''Web Service TCP fölött'' rész …”)
 
a
 
11. sor: 11. sor:
  
 
* [[ElosztottLaborWebService|Elosztott rendszerek]] — Visual Studio 2004
 
* [[ElosztottLaborWebService|Elosztott rendszerek]] — Visual Studio 2004
* [[J2EELaborWS|Szoftverfejlesztés J2EE platformra]] — NetBeans 5.5
+
* [[Szoftverfejlesztés J2EE platformon - Labor: Web Service|Szoftverfejlesztés J2EE platformon]] — NetBeans 5.5
  
 
==Web Service létrehozása==
 
==Web Service létrehozása==

A lap jelenlegi, 2014. február 2., 21:07-kori változata

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót



  • 2006
  • 2007-ben is ugyanaz volt a labor menete, csak a WS kódja változott picit, meg a Web Service TCP fölött rész kimaradt.

Web Service laborok más tárgyakból

Web Service létrehozása

Szükséges: Visual Studio 2005, Web Service Enhancement 3

File / New / Web Site / ASP.NET Web Service

  • Location: File System, c:\wselab\wse
  • Language: C#

App_code / Service.cs

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

public class OrderItem {
	public string Name;
	public int Quantity;
}

[WebService(Namespace = "http://www.aut.bme.hu/wselab/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService {

	[WebMethod]
	public decimal Order(OrderItem[] items) {
		decimal price = 0;
		foreach(OrderItem item in items) {
			price += item.Quantity;
		}
		return price;
	}

}

.NET kliens

Solution-ön Add / New Project / C# Console Application

  • Name: WseClient
  • Mindkét projekten jobb gomb, WSE 3.0-t bekapcsolni (General fülön összes checkboxot beXelni, amit lehet)
  • Service-t indítsuk el Ctrl+F5-tel, másoljuk ki az url-t vágólapra
  • Kliensen Add Web Reference, másoljuk be az url-t, pl. http://localhost:1091/wse/Service.asmx

Program.cs

using System;
using WseClient.localhost;

namespace WseClient {
	class Program {
		static void Main(string[] args) {
			ServiceWse service = new ServiceWse();
			OrderItem[] items = new OrderItem[1];
			items[0] = new OrderItem();
			items[0].Name = "Paper";
			items[0].Quantity = 1000;
			Console.WriteLine(service.Order(items));
		}
	}
}

Authentikáció

Szerveren App_Code könyvtárba hozzunk létre egy UserAuthentication.cs osztályt

using Microsoft.Web.Services3.Security.Tokens;

public class UserAuthentication : UsernameTokenManager {
	protected override string AuthenticateToken(UsernameToken token) {
		return token.Username;
	}
}
  • Szerveren WSE 3.0 / Properties / Security / Security Tokens Manager / Add
    • Token Manager: Username Token Manager
    • Type-ot kell csak megváltoztatni UserAuthentication-re
  • Policy fülön Enable Policy, majd Add...
    • Name: ServerPolicy
    • Secure a Service application
    • Authentication method: Username
    • Enable WS Security 1.1 Extensions: nem kell
  • Service class elé beírni +1 attribútumot: [Policy("ServerPolicy")]
  • Indítsuk el a klienst. Exception-t dob: Username Token nincs benne az üzenetben
  • A WseClient projektben szintén hozzunk létre egy policy-t ClientPolicy néven
    • Secure a Client application
    • Authentication method: Username
    • Ne írjunk be fix user nevet
    • Enable WS Security 1.1 Extensions: nem kell
  • Klienst ki kell egészíteni 3 sorral a service hívás előtt
UsernameToken token = new UsernameToken("Tibi", "Tibi");
service.SetClientCredential(token);
service.SetPolicy("ClientPolicy");
  • A kliensben lefut a hívás, de ha rossz jelszót adunk meg, exception-t dob

A jelszót a következő módon küldi át a kliens

  • véletlen string + hash(jelszó + véletlen string + időpont)
  • A szerver 10 percig fogadja el az üzenetet, de 10 percig cache-eli a kapott véletlen stringeket is, és ha már előfordult, nem fogadja el az üzenetet
  • Ezt az algoritmust hívják digestnek
  • Az algoritmus nem véd az üzenet megváltoztatása ellen, az integritást digitális aláírással lehet biztosítani

Digitális aláírás

Szükséges: IIS Resource Kit Tools-ból SelfSSL csomag.

  • Hozzunk létre egy tanúsítványt: =selfssl /T /V:30 /N:CN=WseLab=
  • Szerveren WSE Settings 3.0 / ServerPolicy / Replace...
    • Secure a service application
    • Authentication method: Username
    • Enable WS Security 1.1 Extensions
    • Sign and encrypt
    • Select Certificate...: WseLab (ide elég lenne olyan certificate, ami csak a publikus kulcsot tartalmazza)
  • Kliensen WSE Settings 3.0 / ClientPolicy / Replace...
    • Secure a client application
    • Authentication method: Username
    • Enable WS Security 1.1 Extensions
    • Sign and encrypt
    • Store location: LocalMachine
    • Select Certificate...: WseLab
  • Ellenőrzés
    • Kliensen WSE Settings 3.0 / Diagnostics / Enable message trace
    • Indítsuk el a klienst
    • bin/debug könyvtárban nyissuk meg a OutputTrace.webinfo-t és szörnyűlködjünk el :)

Web Service TCP fölött

  • Solution / Add / New Project...
    • Name: ConsoleService
  • WSE 3.0-t bekapcsolni
  • References / Add Reference / .NET / System.Web.Services
  • Másoljuk át a UserAuthentication.cs-t
  • WSE Settings 3.0-ban
    • új SecurityToken Manager, Type=UserAuthentication, ConsoleService
    • ServerPolicy-t hasonlóan beállítani, hogy a WsaLab tanúsítványt használja

Program.cs

using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Messaging;
using Microsoft.Web.Services3.Addressing;

public class OrderItem {
	public string Name;
	public int Quantity;
}

[WebService(Namespace = "http://www.aut.bme.hu/wselab/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[Policy("ServerPolicy")]
public class Service : System.Web.Services.WebService {

	[WebMethod]
	public decimal Order(OrderItem[] items) {
		decimal price = 0;
		foreach(OrderItem item in items) {
			price += item.Quantity;
		}
		return price;
	}

}

namespace ConsoleService {
	class Program {
		static void Main(string[] args) {
			Uri address = new Uri("soap.tcp://localhost/OrderService");
			SoapReceivers.Add(new EndpointReference(address), typeof(Service), false);
			Console.ReadLine();
		}
	}
}
  • WseClient app.config-jában, vagy a Web References / localhost property-i között az url-t átállítani soap.tcp://localhost/OrderService-re
  • Solution / Properties
    • Multiple startup project: ConsoleServer és WseClient

-- Peti - 2006.10.13.