2010-05-14 55 views
0

我正在開發webservices。我想維護狀態信息,以便所有WebMethods都可以在登錄後才能訪問。 我已經嘗試,但得到問題。 我附上我的代碼。 任何其他選擇也將受到歡迎。執行網絡服務之間的授權/驗證


[

WebService的(命名空間= 「http://amSubfah.org/」)]

[

WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

//爲了允許這種Web服務從腳本調用,使用ASP.NET AJAX,取消註釋以下行。

// [System.Web.Script.Services.ScriptService]

公共

類登錄:System.Web.Services.WebService {

消息msgObj =新的Message();

BaseClass b = new BaseClass();

PasswordEncryptionDecryption pedObj = new PasswordEncryptionDecryption();

public AuthHeader Authentication = new AuthHeader();

公共登錄(){

//取消對以下行,如果使用設計的部件

的// InitializeComponent();

}

[

SOAPHEADER( 「驗證」,必需=真)]

[System.Web.Services。

的WebMethod(EnableSession =真)]

公共字符串checkUserLogin(字符串用戶,串PWD)

{

數據集dsLogin =新的DataSet();

List sqlParams = new List();

SqlParameter sqlParam1 = new SqlParameter(「@ UserName」,SqlDbType.NVarChar);

sqlParam1.Value = user;

sqlParams。加入(sqlParam1);

SqlParameter sqlParam2 = new SqlParameter(「@ Password」,SqlDbType.NVarChar);

string pass = pedObj.encryptPassword(pwd);

sqlParam2.Value = pass;

sqlParams.Add(sqlParam2);

嘗試

{

b.initializeDBConnection();

dsLogin = b.execSelectLoginQuery(

Query.strSelectLoginData,sqlParams);

}

趕上(SQLEXCEPTION sqlEx)

{

字符串str = msgObj.msgErrorMessage + sqlEx.Message + sqlEx.StackTrace;

}

{如果((dsLogin!= NULL)& &(dsLogin.Tables [0] .Rows.Count!= 0))

{

會話[

「用戶名」] =用戶;

string sessionId = System.Guid.NewGuid()。ToString();

Authentication.sessionId = sessionId;

Authentication.Username = user;

return msgObj.msgLoginSuccess;

}

其他

回報msgObj .msgLoginFail;

}

//的webmethod登記

[

SOAPHEADER( 「驗證」,必需=真)]

[系統名.web。服務。

的WebMethod(EnableSession =真)]

公共字符串insertRegistrationDetails(串FNAME,串L-NAME,電子郵件串,串PWD)

{

//串U =會話[ 「用戶名」 ]的ToString();

//如果(U == 「」)

// {

// // checkUserLogin(FNAME,PWD);

//返回「請先登錄」;

//}

如果(Authentication.Username == NULL || Authentication.sessionId == NULL)

{

回報 「請先登錄」;

}

List sqlParams = new List();

int insert = 0;

string msg =「」;

SqlParameter sqlParam = new SqlParameter(「@ FName」,SqlDbType.NVarChar);

sqlParam.Value = fName;

sqlParam.Size = 50;

sqlParams.Add(sqlParam);

SqlParameter sqlParam1 = new SqlParameter(「@ LName」,SqlDbType.NVarChar);

sqlParam1.Value = lName;

sqlParam1.Size = 50;

sqlParams.Add(sqlParam1);

SqlParameter sqlParam5 = new SqlParameter(「@ Email」,SqlDbType.NVarChar);

sqlParam5.Value = email;

sqlParam5.Size = 50;

sqlParams.Add(sqlParam5);

SqlParameter sqlParam7 = new SqlParameter(「@ Password」,SqlDbType.NVarChar);

sqlParam7.Value = pedObj .encryptPassword(pwd);

sqlParam7.Size = 50;

sqlParams。加入(sqlParam7);

嘗試

{

b.initializeDBConnection();

插入= b.execByKeyParams(

Query.strInsertIntoRegistrationTable1,sqlParams);

如果(插入!= 0)

{

MSG = msgObj .msgRecInsertedSuccess;

}

}

趕上(SQLEXCEPTION sqlEx)

{

字符串str = msgObj.msgErrorMessage + sqlEx.Message + sqlEx.StackTrace;

}

return msg;

}

公共類AuthHeader:SOAPHEADER

{

公共字符串用戶名;

public string sessionId;

}

}

回答

0

你有EnableSession=true一套讓你的存在方式的一部分。進入web服務的每個請求都將被建立爲與登錄用戶相同的會話的一部分。

您的登錄代碼應該在會話中設置某種值以表明用戶已成功登錄。一種方法是將代碼添加到Global.asax(或者創建Global.asax,如果您沒有)這是在每個請求上執行的。在那裏你可以驗證值是保存在會話中,指示正確的登錄。

如果用戶沒有登錄並且正在嘗試調用webservice,那麼global.asax中的代碼將會看到登錄的值未保存在會話中,並且您可以將其重定向到登錄頁面。