当用户想要访问登录所需页面时,我想从地址栏中删除“returnurl = / blabla”。因为我在登录后尝试将用户重定向到静态页面以进行一些选择。
我该怎么做?
答案 0 :(得分:24)
这是表单身份验证的本质。 (我猜你正在使用)。
也就是说,当您访问需要身份验证的页面时,ASP.NET会将您重定向到登录页面,将ReturnUrl作为参数传递,以便您可以返回到登录后的页面。
删除此功能会破坏Forms身份验证本身的语义和设计。 (IMO)
我的建议 - 如果你不需要它,不要使用它。
我正在尝试将用户重定向到 登录后静态页面做一些 选择。
小蛋糕 - 在您完成登录后,而不是使用 FormsAuthentication.RedirectFromLoginPage (使用那个非常ReturnUrl QueryString参数),只需使用 FormsAuthentication.SetAuthCookie 并在任何地方重定向。
答案 1 :(得分:14)
将此添加到Global.asax文件中。
public class MvcApplication : HttpApplication {
private const String ReturnUrlRegexPattern = @"\?ReturnUrl=.*$";
public MvcApplication() {
PreSendRequestHeaders += MvcApplicationOnPreSendRequestHeaders;
}
private void MvcApplicationOnPreSendRequestHeaders( object sender, EventArgs e ) {
String redirectUrl = Response.RedirectLocation;
if ( String.IsNullOrEmpty(redirectUrl)
|| !Regex.IsMatch( redirectUrl, ReturnUrlRegexPattern ) ) {
return;
}
Response.RedirectLocation = Regex.Replace( redirectUrl,
ReturnUrlRegexPattern,
String.Empty );
}
答案 2 :(得分:11)
创建自定义授权属性
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(
AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string loginUrl = "/"; // Default Login Url
filterContext.Result = new RedirectResult(loginUrl);
}
}
}
然后在您的控制器上使用它
[CustomAuthorizeAttribute]
public ActionResult Login()
{
return View();
}
答案 3 :(得分:9)
<强>简单... 强>
[AllowAnonymous]
public ActionResult Login() { return View(); }
[AllowAnonymous]
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); }
<强> Webconfig 强>
<authentication mode="Forms">
<forms loginUrl="~/Account/LoginRedirect" timeout="2880" />
</authentication>
答案 4 :(得分:8)
正如RPM1984指出的那样,您无需在登录后将用户重定向到指定的URL。
如果必须删除ReturnUrl
查询字符串参数,则有几个选项。可能最简单的是在您的登录网页/控制器中,您要检查ReturnUrl
集合中是否存在Request.QueryStrings
参数。如果存在,您可以重定向回登录页面,但没有ReturnUrl
。
另一种选择是为FormsAuthenticationModule
创建自定义实现,该实现是根据其表单身份验证票据处理用户身份验证的类,并负责将未经授权的用户重定向到登录页面。不幸的是,FormsAuthenticationModule
类的方法不是虚拟的,所以你不能创建派生类并覆盖所需的方法,但好消息是类非常简单 - 只需要100-200行代码总计,使用Reflector,您可以快速创建自己的自定义FormsAuthenticationModule
类。如果你走这条路线(我不推荐),那么你需要做的就是取出OnLeave
方法中的ReturnUrl
方法中的代码。 (除了修改此类之外,您还需要配置Web.config文件,以便您的应用程序使用自定义FormsAuthenticationModule
类而不是.NET Framework中的类。)
快乐编程!
答案 5 :(得分:3)
为web.config
添加位置标记。如果您的页面位于子目录中,请将web.config
添加到子目录。
<location path="ForgotPassword.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
ASP将忽略添加ReturnUrl
查询字符串并指示登录。
答案 6 :(得分:2)
如果要从请求中删除returnURL并重定向到特定路径,可以按照以下步骤操作。
首先获取当前上下文,验证用户是否经过身份验证,最后重定向当前路径。
HttpContext context = HttpContext.Current;
//verify if the user is not authenticated
if (!context.User.Identity.IsAuthenticated)
{
//verify if the URL contains ReturnUrl
if (context.Request.Url.ToString().Contains("ReturnUrl"))
{
//redirect the current path
HttpContext.Current.Response.Redirect("~/login.aspx");
}
}
我将此代码放入我的类Login.aspx.cs
中的Page_Load方法中答案 7 :(得分:1)
如果您使用的是asp.net控件loginstatus然后点击登录状态控制按f4(对于属性),在行为部分下我们可以看到LogOutAction选择返回登录页面。
注意:为了成功实现它,您必须有一个名为login.aspx
的登录页面答案 8 :(得分:0)
void Application_BeginRequest(object s, EventArgs e)
{
// ................
// strip return Return Url
if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) && Request.Path.IndexOf("login.aspx")!=-1)
System.Web.HttpContext.Current.Response.Redirect("~/login.aspx");
答案 9 :(得分:0)
您可以使用HttpUtility.ParseQueryString删除该元素。如果您使用VB.NET,则此代码执行此操作
Dim nvcQuery As NameValueCollection
Dim strQuery As String = ""
If Not IsNothing(Request.QueryString("ReturnUrl")) Then
If Request.QueryString("ReturnUrl").Length Then
nvcQuery = HttpUtility.ParseQueryString(Request.QueryString.ToString)
For Each strKey As String In nvcQuery.AllKeys
If strKey <> "ReturnUrl" Then
If strQuery.Length Then strQuery += "&"
strQuery += strKey + "=" + nvcQuery(strKey)
End If
Next
If strQuery.Length Then strQuery = "?" + strQuery
If Request.CurrentExecutionFilePath <> "/default.aspx" Then
Response.Redirect(Request.CurrentExecutionFilePath + strQuery)
Else
Response.Redirect("/" + strQuery)
End If
Response.Write(Server.HtmlEncode(strQuery))
End If
End If
我会把它放在Page.Init事件中 - 显然你需要更改&#34; /default.aspx"匹配登录页面的URL。
答案 10 :(得分:-1)
protected void LoginControl_LoggedIn(object sender, EventArgs e)
{
Response.Redirect("~/selection.aspx");
}