7 Ağustos 2008 Perşembe

TSQL-> SQL 2005 te WEB Servisi oluşturuyoruz 1



USE master

--Sisteme ie ile bağlandığımızda bize kullanıcı soracak.Onu create ediyoruz.
CREATE LOGIN
endpoint_owner
WITH
password='pwd'

-- Bakalım yapabilmiş miyiz?
SELECT NAME FROM master.dbo.syslogins

--Veri çekeceğimiz procedure
CREATE PROCEDURE dbo.usp_getContext
AS
BEGIN
SELECT SUSER_NAME() AS 'LOGIN', USER_NAME() AS 'USER NAME'
END

--Eğer soap_endpoint diye bir noktamız varsa silelim.
DROP ENDPOINT soap_endpoint

--Yeniden oluşturalım
CREATE ENDPOINT
soap_endpoint
AUTHORIZATION
endpoint_owner
STATE = STARTED
AS HTTP
(
PATH = '/sql',
AUTHENTICATION = (ntlm), --{ BASIC | DIGEST | INTEGRATED | NTLM | KERBEROS }
/* BASIC : SSL gerektirmektedir ve Base64 ile encode edilmiş virgül ile ayrılmış
kullanıcı adı ve parola bilgilerini kapsayan bir authentication header içermektedir.

DIGEST : Talep sunucuya gönderilmeden önce kullanıcı adı ve parola MD5 ile şifrelenir.
Sunucunun hem parolaya hem de MD5 hashine erişimi olduğu için doğrulama yapmak amacıyla
istemci tarafından sağlanan verileri karşılaştırma imkanı vardır.
Bu sayede istemci sunucuya, gerçek parolayı vermeden, gerçek parolayı bildiğini ispat edebilmektedir.

INTEGRATED : Sunucu önce Kerberos ile kimlik doğrulama yapmaya çalışır.
İstemcinin Kerberos'u desteklemiyor olması veya negotiation'ın mümkün olmaması durumunda, authentication NTLM'e döner.

NTLM : Windows 95, 98 ve NT 4.0 tarafından desteklenen bir authentication metodudur.
NTLM'de BASIC ve DIGEST'e göre daha güvenli ve aşılması zor bir yapıya sahiptir.
NTLM, Windows 2000 ve sonraki sürümlerde bir Security Support Provider Interface (SSPI) ile sunulmaktadır.

KERBEROS : Internet için standart bir mekanizmadır. Windows 2000 ve sonraki sürümlerde bir SSPI ile desteklenmektedir.
*/
PORTS = (clear),
SITE = '*'
)
FOR SOAP
(
WEBMETHOD 'GetContext'
(
name='master.dbo.usp_getContext'
),
WSDL = DEFAULT,
SCHEMA = STANDARD,

/*Kullanıcının kimliği doğrulandıktan sonra kullanıcı CREATE ENDPOINT ifadesinde yer alacak DATABASE
özelliği ile spesifik bir veritabanına yönlendirilebilir. */
DATABASE = 'master',

NAMESPACE = 'http://tempUri.org/',
LOGIN_TYPE = WINDOWS
);

--Bilgisayarımızda users altında tanımlı bir kullanıcıyı oluşturuyoruz.
CREATE LOGIN
[CNU6261Y11\soap_test]
FROM WINDOWS

SELECT * FROM master.dbo.syslogins

Endpoint imize bağlanabilsin diye yetkilendirelim
GRANT
CONNECT
ON
ENDPOINT::soap_endpoint
TO
[CNU6261Y11\soap_test]




------------------------------------ SIFIRDAN BİR TANE DAHA ----------------

-- Varsa silelim ENDPOINT imizi tekrar oluşturmadan önce
DROP ENDPOINT EuclidParametreleri
-- Varsa silelim kullanıcımızı tekrar oluşturmadan önce
DROP LOGIN [medula\endpointOwner]

/*
Windows içinde bir kullanıcı oluşturuyoruz.
NTLM yapacağımız için.
Kullanıcı adı: endpointOwner olacak.
*/

/*
SQL içinde de bu kullanıcıyı işaret ederek oluşturuyoruz.
Unutmayalım ki bu kullanıcıya SQL içinden bizim DB ye public
dbOwner gibi yetki vermezsek
There was an error in the incoming SOAP request packet: Client, LoginFailure, AccessDenied
hatası alırız.
*/
CREATE LOGIN
[medula\endpointOwner]
FROM WINDOWS
go


/*
ENDPOINT imizi oluşturuyoruz.
*/
CREATE ENDPOINT
EuclidParametreleri
-- Kullanıcımızı bu Endpoint e yetkili ilan edelim.
AUTHORIZATION
[medula\endpointOwner]
-- Durumunu BAŞLATILDI olarak ayarlayalım ki hemen çalışsın
STATE=STARTED
-- HTTP üzerinden çalışacak (TCP de olabilirdi)
AS HTTP
(
-- Demiştim, NTLM olacak ki Windows kullanıcımız işe yarasın
AUTHENTICATION = (NTLM),
-- http://sunucuAdi/sql/EuclidParametreleri?wsdl ile erişeceğiz
PATH = '/sql/EuclidParametreleri',
-- NTLM olduğu için CLEAR, BASIC olsaydı SSL olmak zorundaydı
PORTS = (CLEAR)
)
FOR SOAP
(
-- Metodumuzun adı
WEBMETHOD 'parametreler'
(
-- Tetikleyeceği Function ya da Procedure adı
NAME = 'EuclidLabImport.dbo.testOrtamiParametreleri'
),
-- WSDL olsun lütfen
WSDL = DEFAULT,
-- İlgileneceği VT adını girelim
DATABASE = 'EuclidLabImport'
)
go

-- Başka kullanıcılardan bu EndPointimize olan yetkilerini almak için
REVOKE CONNECT ON ENDPOINT::EuclidParametreleri FROM [medula\endpointOwner];

-- Başka kullanıcılara bu EndPointimize yetki vermek için
GRANT CONNECT
ON
ENDPOINT::EuclidParametreleri
TO
[medula\endpointOwner]
GO

Hiç yorum yok: