[英]Can I restrict a WCF Web Service to only calls from a certain domain?
[英]Is there an attribute I can use in net core 6 to restrict my controller to only allow calls which come from a certain paths?
例如我有一個 class:
public class AccountsController : Controller
{
[HttpPost, Route("LogIn")]
public LogIn([FromBody] request)
{
//log in
}
[HttpPost, Route("LogOut")]
public LogOut([FromBody] request)
{
//log out
}
}
當這些 controller 端點不是直接來自基本域時,我只希望從我的站點訪問這些端點。 示例: www.mysite.com/login不應該工作,但www.mysite.com/uk/login應該工作。 注意:/uk/ 可以是任何東西
我可以在 class 上使用任何屬性或啟動時的約束來實現此目的嗎? 我搜索了路由模板,但似乎沒有任何效果。
我試圖像這樣在啟動時添加約束
endpoint.MapControllerRoute(
name: "Accounts",
constraints: new { accountsConstraint = new AccountsConstraint() },
pattern: "",
defaults: new { controller = "Accounts" });
在帳戶約束中,我正在檢查當前站點是否是基本域,但它只是繞過了這個
當這些 controller 端點不是直接來自基本域時,我只希望從我的站點訪問這些端點。 示例: www.mysite.com/login不應該工作,但www.mysite.com/uk/login應該工作。 注意:/uk/ 可以是任何東西
那么,您可以編寫自己的自定義middleware
來檢查request context
是否來自www.mysite.com/login 。 它將檢查主域是否包含路徑/login
。 意味着/login
之后的任何主域都會導致拒絕。 是你可以實施的方式:
中間件:
public class RestrictLoginFromMainDomainMiddleware
{
private readonly RequestDelegate _next;
public RestrictLoginFromMainDomainMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
var pathToRestrict = "/login";
var host = httpContext.Request.Host.Host;
var path = httpContext.Request.Path.Value?.ToLower();
var completePath = host + path;
if (completePath.Contains(pathToRestrict.ToLower()))
{
httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
await httpContext.Response.WriteAsync("Unauthorized!");
}
await _next(httpContext);
}
}
在 Program.cs 上注冊中間件:
app.UseMiddleware<RestrictLoginFromMainDomainMiddleware>();
注意:在這里,您應該只定義需要限制的路徑。 將自動檢測主域。 例如,您要限制www.anymaindomain.com/login ,因此只定義"/login"
。
Output:
另一種方式:
public class RestrictMainDomainLoginMiddleware
{
private readonly RequestDelegate _next;
public RestrictMainDomainLoginMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
var pathToRestrict = "/login";
if (httpContext.Request.Path.StartsWithSegments(pathToRestrict))
{
httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
await httpContext.Response.WriteAsync("Unauthorized!");
}
await _next(httpContext);
}
}
注意:它將適用於這種情況www.mysite.com/login 。 此處未考慮問題中未指定的其他上下文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.