web-dev-qa-db-ja.com

ASP .NET CORE 3.1 MVCの特定のルートのカスタムミドルウェア(または承認)

My ASP .Net Core 3.1 MVCアプリで、エンドポイントルーティングを使用する

_        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

            endpoints.MapControllerRoute(
                name: "access",
                pattern: "access/",
                defaults: new { controller = "Home", action = "Access" });
        });
_

そのため、/アクセスへの参照、アクセスアクションを起動します。ここで、アプリはユーザーがいくつかのアクセス要件に準拠しているかどうかを確認します。

_if (access checks...)
{
    return View();
}
_

これで、このチェックをコントローラに使用するのではなく、カスタムミドルウェア(またはおそらくカスタム承認属性)でチェックすることをお勧めします。だからあなたへの私の質問は、/アクセス領域のカスタムミドルウェアを含めるために、UseEndpoints呼び出しをどのように書き換えるべきですか?

5
user2768479

ASP.NET COREのAuthorizeAttributeと一緒にIAuthorizationFilterを拡張することができます

1. AuthorizeAttributeを拡張するクラスを作成します。これは、ASP.NETコアの内蔵_[Authorize]_属性などのコントローラの上部またはアクションで使用されます。

2.プリフェートOnAuthorization(AuthorizationFilterContext context)IAuthorizationFilterインタフェースの一部です。

3.許可ユーザーに対して追加の操作なしのキーワードreturnキーワード。

4. AuthorizationFilterContextcontext.Result = new UnauthorizedResult()として許可されていないユーザーの許可されていない場合

_    public class SampleAuthorizePermission : AuthorizeAttribute, IAuthorizationFilter
{
    public string Permissions { get; set; }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        if (string.IsNullOrEmpty(Permissions))
        {
            context.Result = new UnauthorizedResult();
            return;
        }

        var userName = context.HttpContext.User.Identity.Name;

        var assignedPermissionsForUser =
            MockData.UserPermissions
                .Where(x => x.Key == userName)
                .Select(x => x.Value).ToList();

        var requiredPermissions = Permissions.Split(",");
        foreach (var x in requiredPermissions)
        {
            if (assignedPermissionsForUser.Contains(x))
                return;
        }

        context.Result = new UnauthorizedResult();
        return;
    }
}
_

そしてあなたのコントローラに

_[SampleAuthorizePermission(Permissions = "CanRead")]
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
_
1
Vahid