|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着!关头字:FormsAuthentication,loginUrl,ReturnUrl,AbsoluteUri
在ASP.NET使用程序中,FormsAuthentication几近是标配,但FormsAuthentication在计划时却没有思索登录程序与以后程序不在统一个站点的场景。这个场景最基础的需求就是往另外一个站点登录乐成后前往要原地。但是FormsAuthentication在传送ReturnUrl时只撑持绝对路径,不撑持相对地点,也没有供应响应的扩大。
好比我们在admin.cnblogs.com站点的web.config中举行了以下的FormsAuthentication设置:- <authenticationmode="Forms"><formsloginUrl="http://passport.cnblogs.com/login.aspx"timeout="2880"enableCrossAppRedirects="true"/></authentication><authorization><denyusers="?"/></authorization>
复制代码 会见admin.cnblogs.cc/Home/Index,会被重定向至passport.cnblogs.com/login.aspx?ReturnUrl=%2fHome%2fIndex,如许登录后就回不来了。
那怎样办理这个成绩呢?
今朝找到了三种办法:
办法一:在以后使用程序增加一个登录跳板页,web.config中的loginUrl指向该跳板,在跳板中猎取ReturnUrl的相对地点,再重定向至实践登录页面。
好比在ASP.NETMVC中,我们能够用一个Controller的Action作为跳板,代码以下:- publicclassLoginController:Controller{publicActionResultRedirect(){varloginUrl="http://passport.cnblogs.com/login.aspx";varreturnUrl="?ReturnUrl=http://"+Request.Url.Host+Request.QueryString["ReturnUrl"];returnRedirectPermanent(loginUrl+returnUrl);}}
复制代码 然后将web.config中的loginUrl指向该Action。
该办法的弱点是要举行两次重定向。
办法二:在Global.asax的Application_PostAuthenticateRequest事务中将ReturnUrl设置为相对地点,偏重定向至登录页面。
代码以下(代码来自http://forums.asp.net/t/1358796.aspx):- protectedvoidApplication_PostAuthenticateRequest(objectsender,EventArgse){if(!UrlAuthorizationModule.CheckUrlAccessForPrincipal(Request.AppRelativeCurrentExecutionFilePath,Context.User,Request.RequestType)){Response.Redirect(String.Format("{0}?ReturnUrl={1}",FormsAuthentication.LoginUrl,Request.Url.AbsoluteUri));}}
复制代码 办法三:在Global.asax的Application_EndRequest事务中修正Response.RedirectLocation,将ReturnUrl的交换为相对地点。
代码以下(代码来自DavidFindleysBlog):- protectedvoidApplication_EndRequest(objectsender,EventArgse){stringredirectUrl=this.Response.RedirectLocation;if(!string.IsNullOrEmpty(redirectUrl)){this.Response.RedirectLocation=Regex.Replace(redirectUrl,"ReturnUrl=(?url.*)",delegate(Matchm){stringurl=HttpUtility.UrlDecode(m.Groups["url"].Value);Uriu=newUri(this.Request.Url,url);returnstring.Format("ReturnUrl={0}",HttpUtility.UrlEncode(u.ToString()));},RegexOptions.Singleline|RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture);}}
复制代码 该办法的弱点是要针对一切重定向的URL举行处置,不单单是登录。
我们选用的是第二种办法。你是怎样办理这个成绩的?有无更好的办法?
这个成绩完整归罪于FormsAuthentication的计划成绩,事先碰到这个成绩,都不敢信任微软没思索到这个,然后看了一下FormsAuthentication的代码,真是无语。。。
明天写这篇博文出来宣泄一下,以解心头之恨。
从中失掉的启发:糟的计划会被良多人骂良多年,而优异的计划会千古流芳。
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。 |
|