在ASP.NET MVC3 中利用JSONP跨域登錄WEB系統

作者: ryanding  來源: 博客園  發布時間: 2011-04-12 10:54  閱讀: 3756 次  推薦: 2   原文鏈接   [收藏]  

  在信息系統開發的時,根據相關業務邏輯難免會多系統之間互相登錄。一般情況下我們需要在多系統之間使用多個用戶名和密碼。這樣客戶就需要在多個系統之間重復登陸。每次登錄都需要輸入用戶名和密碼。最近比較流行的就是OAuth。新浪微博這個開放系統做的就很好。但OAuth并非本文討論范疇。這里主要討論jQuery1.5 jsonp 在Asp.net MVC3 中的應用。

  本文應用場景:

  假設您的開發團隊欲為某集團公司開發一整套信息管理系統,目前首要開發的就是一套訂單系統和一套內部OA系統。前提是這兩套系統使用同一套數據庫。只是兩個不同的MVC3.0 Web項目。也就是說會在同一個IIS上部署兩個虛擬目錄。  我們的目標是在不使用WCF、WebService 等技術實現跨域登錄。也就是說用戶用同一個帳號登錄了訂單系統,那么客戶就可以直接登錄OA系統。而不需要在OA系統上再輸入一次用戶名和密碼。反之亦成立。

  jQuery1.5 JSONP 使用:

 
<script type="text/javascript">
$(function () {
var oAUri = "@ViewBag.OAVRUri";
var user = "@ViewBag.User";
var pwd = "@ViewBag.PassWord";

$.ajax({
type:
"GET",
url: String.format(
'{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd),
cache:
false,
error:
function () {
alert(
"程序出錯,請聯系管理員.");
},
dataType:
"jsonp",
jsonp:
'callback',
success:
function (result) {

}
});

});

</script>

  在MVC3.0中建立JSONP專用ActionResult。

  代碼如下:

 
public class JsonpResult<T> : ActionResult
{

public T Obj { get; set; }
public string CallbackName { get; set; }

public JsonpResult(T obj, string callback)
{

this.Obj = obj;
this.CallbackName = callback;
}


public override void ExecuteResult(ControllerContext context)
{
var js
= new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonp
= this.CallbackName + "(" + js.Serialize(this.Obj) + ")";

context.HttpContext.Response.ContentType
= "application/json";
context.HttpContext.Response.Write(jsonp);
}
}

  JsonpResult 簡單調用如下:

 
public ActionResult AppLogOn(string UserName, string PassWord, string callback)
{

return new JsonpResult<object>(new { success = true, rankName = rankName }, callback);
}

  AppLogOn的action參數完全和上文中的jquery $.ajax 參數一致:

 
url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd)

  小結:

  Jsonp的服務器端的原理其實就是回調一個js函數名(這里是callback參數)將該參數傳給服務端,接著再由服務器端執行這個callback js函數, 同時附上該js函數的參數。比如上文的C#代碼: var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";還有一點我們要注意的就是安全隱患問題: 在使用jsonp由于涉及到跨域,需要考慮到對方站點或者對方系統的安全性問題。應當避免安全隱患,不能濫用jsonp。

2
1
 
標簽:ASP.NET MVC3
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()