我有一个中间件类,该类读取用户的cookie并对其进行验证,然后在它们无效或丢失时重定向到登录URL。重定向到用户的URL包含一个“后退”参数。当该应用程序不是IIS中的嵌套应用程序时,该中间件在静态文件SPA上可以很好地工作。
我的问题,在使用MVC控制器和视图时,这在用户重定向到登录页面之前以某种方式删除路径(指向嵌套的IIS站点)并且返回URL不包含URL路径时不起作用。有什么想法吗?
会发生什么
重定向到-> http://login.com?back= http://test.com
应该怎么办
重定向到-> http://login.com?back= http://test.com/mysite
public class MyMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private readonly IOptions<MyMiddlewareOptions> _options;
public MyMiddleware(RequestDelegate next, IOptions<MyMiddlewareOptions> options, ILoggerFactory logger)
{
_next = next;
_options = options;
_logger = logger.CreateLogger("My Middleware");
}
public async Task Invoke(HttpContext context)
{
var middlewareCookieValidator = context.RequestServices.GetService<IMiddlewareCookieValidator>();
await new CookieRequestCultureProvider().DetermineProviderCultureResult(context);
if (!_options.Value.Bypass && !Path.HasExtension(context.Request.Path.Value))
{
try
{
if (wslCookieValidator.HasCreatedCookies(context) || await middlewareCookieValidator.ValidateCookiesAsync())
{
context.Response.OnStarting(async () => await middlewareCookieValidator.GenerateAndApplyCookiesToResponse(context));
await _next(context);
}
else
{
var location = new Uri($"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}");
context.Response.Redirect($"{_options.Value.Url}?back={location}");
}
}
catch (Exception exception)
{
throw new Exception($"RequestDelegate '_next' = {_next}. {exception.Message}");
}
}
else
{
await _next(context);
}
}
}
}
答案 0 :(得分:1)
这可能是URL编码问题。您应该使用back
对传递到System.Net.WebUtility.UrlEncode()
查询字符串参数中的URL进行编码。例如:
using System.Net;
// ...
var location = new Uri($"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}");
context.Response.Redirect($"{_options.Value.Url}?back={WebUtility.UrlEncode(location)}");
答案 1 :(得分:0)
@李克强
由于IIS与子应用程序一起运行,因此谢谢您的回答。
我需要执行以下操作。
var location = new Uri($"{context.Request.Scheme}://{context.Request.Host}{context.Request.PathBase}{context.Request.Path}{context.Request.QueryString}");