繁体   English   中英

如果存在cookie,则重定向到特定的URL

[英]Redirect to specific URL if cookie exists

如果Cookie存在,我目前正在尝试转到特定的URL。

例如

/ANYCONTROLLER/ANYMETHOD to /CONTROLLER2/METHOD2

目前,我的身份验证Cookie的配置如下:

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
     AuthenticationScheme = "AmcClientCookie",
     AutomaticAuthenticate = true,
     AutomaticChallenge = true,
     LoginPath = new Microsoft.AspNetCore.Http.PathString("/Public/Home"),
     CookieSecure = hostingEnvironment.IsDevelopment()
                  ? CookieSecurePolicy.SameAsRequest
                  : CookieSecurePolicy.Always,
     ExpireTimeSpan = TimeSpan.FromDays(1)
 });

我试图在自定义授权处理程序中执行此操作,但是无法访问HttpContext

因此,我尝试在操作筛选器中执行此操作,但似乎无法访问身份验证以了解或是否已连接用户。

如果有人有想法。

可能还有其他方法,但是中间件似乎最适合此方法( 更多信息 )。

简短的方法

在您的startup.cs类的Configure方法中, app.UseMvc(...)调用之后,添加以下内容:

app.Use((context, next) =>
{
    if (context.User.Identity.IsAuthenticated)
    {
        var route = context.GetRouteData();
        if (route.Values["controller"].ToString() == "ANYCONTROLLER" &&
            route.Values["action"].ToString() == "ANYMETHOD")
        {
            context.Response.Redirect("/CONTROLLER2/METHOD2");
        }
    }

    return next();
});

长方法

使用以下命令创建一个名为UrlRewriteMiddleware.cs的类:

public class UrlRewriteMiddleware
{
    private readonly RequestDelegate _next;
    public UrlRewriteMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {

        if (context.User.Identity.IsAuthenticated)
        {
            var route = context.GetRouteData();
            if (route.Values["controller"].ToString() == "ANYCONTROLLER" &&
                route.Values["action"].ToString() == "ANYMETHOD")
            {
                context.Response.Redirect("/CONTROLLER2/METHOD2");
            }
        }

        await _next.Invoke(context);
    }
}

使用以下命令创建另一个名为MiddlewareExtensions.cs的类:

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseUrlRewriteMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<UrlRewriteMiddleware>();
    }
}

在您的startup.cs类的Configure方法中, app.UseMvc(...)调用之后,添加以下内容:

app.UseUrlRewriteMiddleware();

您也可以使用

context.Request.Path = "/CONTROLLER2/METHOD2";

而不是重定向,但浏览器网址不会反映新路径,而是显示第一个路径。 如果应该显示错误消息或拒绝消息,则Path可能更合适。

我假设您正在使用asp.net身份验证通道,因此可以像示例中一样测试身份验证。 如果没有,您可以访问

context.Request.Cookies

快速笔记(阅读评论)

在设置Mvc路由之前, GetRouteData返回null。 因此,您必须在设置Mvc路由后注册此中间件。

如果出于任何原因必须早些做,则可以通过request.Request.Path访问该URL并手动对其进行解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM