특정 경로를 사용하지 않도록 제한하려면 어떻게해야합니까?
내 startup.cs에는 두 개의 mapendpoint가 있습니다.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "botConfiguration",
pattern: "bot/{botID}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
내 컨트롤러에서
public IActionResult Setting(int botID)
{
//botConfigRepository.GetAll();
return View();
}
botID가 내 경로에 정의되어 있지 않으면이 작업을 호출 할 수 없거나 일종의 기본 페이지로 리디렉션됩니다.
이제 나는 내가 할 수 있다는 것을 안다.
if (botID == 0 ){
return RedirectToAction("Index");
}
어떤 종류의 일이지만 모든 행동에 대해 이것을 작성하는 것은 일종의 고통스러운 소리입니다.
물론 ASP.NET Core는 교차 절단 문제를 구현하는 여러 방법을 지원합니다. 원하는 방식에 따라 다르지만 다음과 같이 사용자 지정 미들웨어 델리게이트를 추가하는 것만 큼 간단 할 수 있습니다.
// In Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Placed before app.UseEndpoints()
app.Use(async (ctx, next) => {
if (!ctx.Request.Query.ContainsKey("botID") && !ctx.Request.Path.Value.Contains("Index"))
ctx.Response.Redirect("Index");
else
await next();
});
}
(두 번째 조건은 계단식 리디렉션을 방지하기위한 것입니다.)
미들웨어는 기본적으로 각 미들웨어가 제어 또는 단락을 통과 할 수있는 책임 구조의 체인 인 요청 처리 파이프 라인의 최상위 구성 부분입니다. ASP.NET의 자체 구성 요소는 인증 미들웨어 및 라우팅 미들웨어와 같은 미들웨어로 구현됩니다. 그리고 이것들이 내부에 추가 Startup.cs/Configure()
되는 순서가 실행 순서를 결정합니다.
따라서 상대적으로 낮은 수준의 것을 달성하려는 경우 가장 깨끗한 방법은 종종 미들웨어를 사용하는 것입니다. 를 사용하여 적절한 미들웨어 클래스 를 추가 할 수도 있습니다 app.UseMiddleware()
.
(주의해야 할 한 가지는 미들웨어에 싱글 톤 수명이 있으므로 요청 범위 서비스를 삽입하는 것이 문제가됩니다. 이 질문을 참조하십시오 .)
대체 솔루션 ActionFilter
으로 누군가가 다음과 같이 언급 했듯이 동일한 결과를 얻기 위해 전역 등록 을 사용할 수 있습니다 .
public class MyActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context) {}
public void OnActionExecuting(ActionExecutingContext ctx)
{
if (!ctx.HttpContext.Request.Query.ContainsKey("botID") && !ctx.HttpContext.Request.Path.Value.Contains("Index"))
{
ctx.Result = new RedirectResult("Index");
}
}
}
// Register it in Startup.ConfigureServices()
services.AddMvc(options => options.Filters.Add(new MyActionFilter()));
추가 요구 사항이있는 경우 언제든지 의견을 보내 주시면 해결해 드리겠습니다. :)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다