• 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统


    在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录。一般情况下我们需要在多系统之间使用多个用户名和密码。这样客户就需要在多个系统之间重复登陆。每次登录都需要输入用户名和密码。最近比较流行的就是OAuth。新浪微博这个开放系统做的就很好。但OAuth并非本文讨论范畴。这里主要讨论jQuery1.5 jsonp 在Asp.net MVC3 中的应用。

        本文应用场景:

            假设您的开发团队欲为某集团公司开发一整套信息管理系统,目前首要开发的就是一套订单系统和一套内部OA系统。前提是这两套系统使用同一套数据库。只是两个不同的MVC3.0 Web项目。也就是说会在同一个IIS上部署两个虚拟目录。  我们的目标是在不使用WCF、WebService 等技术实现跨域登录。也就是说用户用同一个帐号登录了订单系统,那么客户就可以直接登录OA系统。而不需要在OA系统上再输入一次用户名和密码。反之亦成立。

        jQuery1.5 JSONP 使用:

    <script type="text/javascript">
    2 $(function () {
    3 var oAUri = "@ViewBag.OAVRUri";
    4 var user = "@ViewBag.User";
    5 var pwd = "@ViewBag.PassWord";
    6
    7 $.ajax({
    8 type: "GET",
    9 url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd),
    10 cache: false,
    11 error: function () {
    12 alert("程序出错,请联系管理员.");
    13 },
    14 dataType: "jsonp",
    15 jsonp: 'callback',
    16 success: function (result) {
    17
    18 }
    19 });
    20
    21 });
    22 </script>


       在MVC3.0中建立JSONP专用ActionResult

          代码如下:

    1 public class JsonpResult<T> : ActionResult
    2 {
    3 public T Obj { get; set; }
    4 public string CallbackName { get; set; }
    5
    6 public JsonpResult(T obj, string callback)
    7 {
    8 this.Obj = obj;
    9 this.CallbackName = callback;
    10 }
    11
    12 public override void ExecuteResult(ControllerContext context)
    13 {
    14 var js = new System.Web.Script.Serialization.JavaScriptSerializer();
    15 var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";
    16
    17 context.HttpContext.Response.ContentType = "application/json";
    18 context.HttpContext.Response.Write(jsonp);
    19 }
    20 }

    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。

    本文为 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统 这篇文章的改进版。在上文中首先感谢园友们的热心讨论。本文将对跨域登录进行一改进,改进内容如下:

    •      跨域登录后不同系统之间的cookie管理。
    •      主系统注销登录后子系统同步注销。
    •      支持除IE外的FireFox 、Opera、Chrome、Safari主流浏览器。

         若要管理好cookie,这里以为多个ASP.NET MVC3 功能为例。用.NET的 IFormsAuthenticationService 进行权限认证。我们只要在web.config中这样设置:

     <authentication mode="Forms">
          <forms loginUrl="~/Account/LogOn" timeout="2880" name="App1" />
      </authentication>

    请注意红色部分,这样IIS set-cookie 权限时将以App1作为Cookie名,否则会用asp.net默认名称作为cookie名称。这样我们有多系统jsonp登录时,保存用户的cookie就会被覆盖。

    如果您也感兴趣,可以使用抓包工具查看IIS 对用户权限认证 set-cookie 过程。

          在jQuery1.5中使用jsonp我发现只有IE下正常,其他的浏览器都不正常。经过一番搜索找到解决方案:http://code.google.com/p/jquery-jsonp/ 这里有一个相对完整的解决方案。使用该js插件,就可以多浏览器支持jsonp了。

    最后附上程序截图以及完整的相关demo.

    本例demo这里下载:ryanding/JSONP.rar


  • 相关阅读:
    Unity之串口通信(基于三姿态传感器)
    Unity3d win7协议多点触控
    大大的蛋项目 第二篇 第三关
    大大的蛋项目
    Unity3d 调用C++的DLL
    有梦想的小鸟
    【Unity3D插件】NGUI屏幕自适应 .
    【Unity3d】使GUI适应屏幕分辨率
    unity自动保存项目
    BloomFilter——大规模数据处理利器
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2042597.html
Copyright © 2020-2023  润新知