如果Cookie存在,我目前正在尝试访问特定的网址。
例如
/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 。
所以我尝试在操作过滤器中执行此操作,但似乎我无法访问身份验证以了解用户是否已连接。< / p>
如果有人有想法。
答案 0 :(得分:2)
可能还有其他方法,但中间件似乎最合适(more info)。
简短方法:
在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";
而不是重定向,但浏览器Url不会反映新路径并显示第一个路径。如果它应该显示错误或被拒绝的消息,那么路径可能更合适。
我假设您正在使用asp.net身份验证通道,因此您可以像示例一样测试身份验证。如果没有,您可以访问
中的cookiecontext.Request.Cookies
快速记录(阅读评论)
在设置Mvc路由之前, GetRouteData
返回null。因此,您必须在Mvc路由设置之后注册此中间件。
如果由于任何原因您必须提前执行此操作,您可以通过request.Request.Path
访问该网址并手动解析。