跨站点的单点登录

 

1、Web.config里设置Form登录,name为Cookie名,关键在于domain和loginUrl。把几个要单点登录的站点做同样设置。

    < authentication  mode ="Forms" >
    
< forms  name ="rkanr_validuser"  domain =".rkr.com"    loginUrl ="http://user.rkr.com/SignIn.aspx" />
   
</ authentication >

2、写默认转跳的方法。

          /// <summary>
         
/// 返回原先登陆页面地址
         
/// </summary>
         
/// <returns></returns>

          public   static   string  GetLoginUrl()
         
{
             
return "http://" + WebHelper.Domain.UserDomain + "/SignIn.aspx?ReturnUrl=" + System.Web.HttpContext.Current.Server.UrlEncode(GetUrl());
         }


         
/// <summary>
         
/// 直接跳转向页面
         
/// </summary>

          public   static   void  RedirectLoginPage()
         
{
             System.Web.HttpContext.Current.Response.Redirect(GetLoginUrl());
         }

3、点击登录或注销时调用上面的方法,页头如果要判断是否登录也一样

      protected   void  btnLogin_Click( object  sender, EventArgs e)
     
{
         
if (Profile.IsAnonymous)
         
{
             WebHelper.Pages.RequestInfo.RedirectLoginPage();
         }

         
else
         
{
             FormsAuthentication.SignOut();
             Response.Redirect(Session[
"CurrUrl"].ToString());
         }

     }

注意上面注销的时候要转跳,其实转跳的地方就是本页面,因为注销要刷新才看到效果,不得已而为之
     protected   void  Page_Load( object  sender, EventArgs e)
     
{
         
if (!IsPostBack)
         
{
             Session[
"CurrUrl"= WebHelper.Pages.RequestInfo.GetUrl();
        }

     }

4、登录页面显示时保存要转跳的地址

      private   void  Page_Load( object  sender, EventArgs e)
     
{
         
//自动转跳,start
         if (this.Request.QueryString["ReturnUrl"!= null)
         
{
             
string ReturnUrl = WebHelper.Pages.RequestInfo.GetQueryString("ReturnUrl");
             Session[
"ReturnUrl"= ReturnUrl;
         }

         
//自动转跳,end
     }

5、点击登录时,如成功就转跳回要返回的地址

      /// <summary>
     
/// 登陆
      
/// </summary>
     
/// <param name="sender"></param>
     
/// <param name="e"></param>

      protected   void  btnLogin_Click( object  sender, EventArgs e)
     
{
         
//收集数据
         string strUserName = this.txtUserName.Text.Trim();
         
string strPsw = this.txtPsw.Text.Trim();
         
string strValidTime = rbtnValidTime.SelectedItem.Text;

         
if (Membership.ValidateUser(strUserName, strPsw))
         
{
             setValidTime(strValidTime, strUserName);

             
//测试返回地址是否存在,start
             if (Session["ReturnUrl"!= null)
             
{
                 Response.Redirect(Session[
"ReturnUrl"].ToString());
             }

             
//测试返回地址是否存在,end
         }

         
else
         
{
             lblTipInfo.Text 
= "登陆失败,请重新输入!";
         }

     }



     
/// <summary>
     
/// 设置有效时间,注释的部分原本是要的,但要跨站点登录就不需要了
     
/// 而是在上面的方法中转跳,因为系统的转跳只到本站点
     
/// </summary>
     
/// <param name="strValid"></param>

      protected   void  setValidTime( string  strValid,  string  strUserName)
     
{
         
string encTicket;
         FormsAuthenticationTicket ticketObj;

         
switch (strValid)
         
{
             
case "永远":
                 ticketObj 
= new FormsAuthenticationTicket(strUserName, true86400);
                 encTicket 
= FormsAuthentication.Encrypt(ticketObj);
                 Response.Cookies.Add(
new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                 
//FormsAuthentication.RedirectFromLoginPage(strUserName, true);
                 FormsAuthentication.SetAuthCookie(strUserName, true);
                 
break;
             
case "一个月":
                 ticketObj 
= new FormsAuthenticationTicket(strUserName, true43200);
                 encTicket 
= FormsAuthentication.Encrypt(ticketObj);
                 Response.Cookies.Add(
new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                 
//FormsAuthentication.RedirectFromLoginPage(strUserName, true);
                 FormsAuthentication.SetAuthCookie(strUserName, true);
                 
break;
             
case "一天":
                 ticketObj 
= new FormsAuthenticationTicket(strUserName, true1440);
                 encTicket 
= FormsAuthentication.Encrypt(ticketObj);
                 Response.Cookies.Add(
new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                 
//FormsAuthentication.RedirectFromLoginPage(strUserName, true);
                 FormsAuthentication.SetAuthCookie(strUserName, true);
                 
break;
             
case "一小时":
                 ticketObj 
= new FormsAuthenticationTicket(strUserName, true60);
                 encTicket 
= FormsAuthentication.Encrypt(ticketObj);
                 Response.Cookies.Add(
new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                 FormsAuthentication.SetAuthCookie(strUserName, 
true);
                 
//FormsAuthentication.RedirectFromLoginPage(strUserName, true);
                 break;
             
//浏览器进程
             default:
                 
//FormsAuthentication.RedirectFromLoginPage(strUserName, false);
                 FormsAuthentication.SetAuthCookie(strUserName, true);
                 
break;
         }

     }
 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值