部署到具有子域的网站时,AuthorizeAttribute 重定向到不正确的 url
AuthorizeAttribute redirecting to an incorrect url when deployed to a website with a subdomain
通常(例如在我的本地主机上),[Authorize]
正确重定向到 CookieAuthenticationOptions
.
中指定的 LoginPath
但是,当我部署到暂存站点 (staging.mysite.com
) 时,授权重定向似乎放错了 url 的一部分。
就我而言,它将:
http://staging/Account.mysite.com/Login?ReturnUrl=%2FHome%2FAuthorize
应该去的时间:
http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize
该应用程序非常基础:
//Startup.cs
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Logout";
options.AccessDeniedPath = "/Home/Unauthorized";
options.ReturnUrlParameter = "ReturnUrl";
});
services.AddMvc()
//....
app.UseMvc();
我的控制器:
//HomeController.cs
[Route("[controller]/[action]")]
public class HomeController : Controller
{
[Authorize]
public IActionResult Authorize()
{
return Ok("You are authorized");
}
}
//AccountController.cs
[Route("[controller]/[action]")]
public class AccountController : Controller
{
public IActionResult Login()
{
return View(new LoginViewModel());
}
}
有人看到我哪里错了吗?
更新:
奇怪的是,如果我进行以下更改,它就会起作用。所以看起来问题在于在路线中指定了动作?
options.LoginPath = "/Login"; //I removed /Account
[HttpGet("/Login")] //I added the "/Login" template
public IActionResult Login()
试试这个
options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
编辑
删除它
options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
并添加它
options.Events = new CookieAuthenticationEvents()
{
OnRedirectToLogin = (context) =>
{
context.HttpContext.Response.Redirect("http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize");
return Task.CompletedTask;
}
};
你是这样定义路由的吗?
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
);
如果没有添加到RouteConfig.cs。
或者您可以直接使用 [Route("route")].
定义路线
找到问题。
问题是不是 asp.net 核心或我的应用程序。
问题出在我们在 IIS 中使用的重定向正则表达式上。
通常(例如在我的本地主机上),[Authorize]
正确重定向到 CookieAuthenticationOptions
.
LoginPath
但是,当我部署到暂存站点 (staging.mysite.com
) 时,授权重定向似乎放错了 url 的一部分。
就我而言,它将:
http://staging/Account.mysite.com/Login?ReturnUrl=%2FHome%2FAuthorize
应该去的时间:
http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize
该应用程序非常基础:
//Startup.cs
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Logout";
options.AccessDeniedPath = "/Home/Unauthorized";
options.ReturnUrlParameter = "ReturnUrl";
});
services.AddMvc()
//....
app.UseMvc();
我的控制器:
//HomeController.cs
[Route("[controller]/[action]")]
public class HomeController : Controller
{
[Authorize]
public IActionResult Authorize()
{
return Ok("You are authorized");
}
}
//AccountController.cs
[Route("[controller]/[action]")]
public class AccountController : Controller
{
public IActionResult Login()
{
return View(new LoginViewModel());
}
}
有人看到我哪里错了吗?
更新:
奇怪的是,如果我进行以下更改,它就会起作用。所以看起来问题在于在路线中指定了动作?
options.LoginPath = "/Login"; //I removed /Account
[HttpGet("/Login")] //I added the "/Login" template
public IActionResult Login()
试试这个
options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
编辑 删除它
options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
并添加它
options.Events = new CookieAuthenticationEvents()
{
OnRedirectToLogin = (context) =>
{
context.HttpContext.Response.Redirect("http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize");
return Task.CompletedTask;
}
};
你是这样定义路由的吗?
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
);
如果没有添加到RouteConfig.cs。 或者您可以直接使用 [Route("route")].
定义路线找到问题。
问题是不是 asp.net 核心或我的应用程序。
问题出在我们在 IIS 中使用的重定向正则表达式上。