web-dev-qa-db-ja.com

開発および本番用の.NETCoreAPI条件付き認証属性

簡単に言うと、APIに環境ベースの承認属性を配置して、開発時に承認制限をオフにし、本番環境で再びオンにすることはできますか?

.NET CoreAPIを呼び出したい別のAngular 2プロジェクトがあります。Angular 2プロジェクトを開くことができるように、別のプロジェクトを作成しましたvscodeでTypeScriptをデバッグします。終了したら、プロジェクトをビルドし、セキュリティ上の理由から.NETCoreプロジェクト内に配置します。

私たちの問題は、デバッグ段階でAPIに接続できないことです。これは、APIが2つの別個のプロジェクトであり、Angular 2プロジェクトにActiveDirectoryがないためです。NETCoreプロジェクトには現在認証属性とAPIへのアクセス(401)を許可しません。開発中にこれをオフにし、本番中に再びオンにできると便利です。

また、この問題を最もよく解決する方法について、他の提案も受け付けています。

[Authorize: (Only in Production)] <-- // something like this???
[Route("api/[controller]")]
public class TestController : Controller
{
    ...
11
aholtry

ASP.NET Core認証は、ポリシーに基づいています。ご覧のとおり、AuthorizeAttributeはポリシー名を使用できるため、リクエストを承認するために満たす必要のある基準がわかります。その件について すばらしいドキュメント を読んでおくことをお勧めします。

問題に戻ると、特定のポリシーを使用していないように見えるため、デフォルトのポリシーを使用します。これは、デフォルトで ユーザーの認証が必要です です。

その動作はStartup.csで変更できます。開発モードの場合は、デフォルトのポリシーを再定義して、要件がないようにすることができます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(x =>
    {
        // _env is of type IHostingEnvironment, which you can inject in
        // the ctor of Startup
        if (_env.IsDevelopment())
        {
            x.DefaultPolicy = new AuthorizationPolicyBuilder().Build();
        }
    });
}

更新

im1dermikeはコメントで、AuthorizationPolicyには少なくとも1つの要件が必要であると述べています。これは、 ここ で確認できます。そのコードは最近導入されていないので、上記の解決策がずっと壊れていたことを意味します。

これを回避するために、RequireAssertionの-​​ AuthorizationPolicyBuilder メソッドを利用して、ダミーの要件を追加することができます。これは次のようになります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(x =>
    {
        // _env is of type IHostingEnvironment, which you can inject in
        // the ctor of Startup
        if (_env.IsDevelopment())
        {
            x.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAssertion(_ => true)
                .Build();
        }
    });
}

これにより、承認ポリシーに少なくとも1つの要件があり、それが常に合格することがわかります。

18

私はこれで終わります、助けるかもしれません:

    public class OnlyDebugModeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
#if DEBUG

        //Ok
#else
        context.Result = new ForbidResult();
        return;
#endif

    }
}

コントローラーに適用します

[OnlyDebugMode]
[Route("api/[controller]")]
[ApiController]
public class DebugController : ControllerBase
{ 
1
Yann

これが私の解決策です:

コントローラの新しい属性:

[AzureADAuthorize]

AzureADAuthorize.cs:

public class AzureADAuthorize : AuthorizeAttribute
    {
        public AzureADAuthorize() : base(AzureADPolicies.Name)
        {
        }

    }

AzureADPolicies.cs:

public static class AzureADPolicies
    {
        public static string Name => "AzureADAuthorizationRequired";

        public static void Build(AuthorizationPolicyBuilder builder)
            {
                if (StaticRepo.Configuration.GetValue<bool>("EnableAuthorization") == true)
                {
                    var section = StaticRepo.Configuration.GetSection($"AzureAd:AuthorizedAdGroups");
                    var groups = section.Get<string[]>();
                    builder.RequireClaim("groups", groups);

                }
                else if (StaticRepo.Configuration.GetValue<bool>("EnableAuthentication") == true)
                {
                    builder.RequireAuthenticatedUser();
                }else
                {
                    builder
                    .RequireAssertion(_ => true)
                    .Build();
                }             
            }
    }

Startup.cs:

//Authentication & Authorization
            #region AUTHENTICATION / AUTHORICATION

            StaticRepo.Configuration = Configuration;


                services.AddAuthorization(options =>
                {
                    options.AddPolicy(
                        AzureADPolicies.Name, AzureADPolicies.Build);
                });

            services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
             .AddAzureAD(options => Configuration.Bind("AzureAd", options));

            #endregion

Appsettings.json:

 "EnableAuditLogging": false,
  "EnableAuthentication": true,
  "EnableAuthorization": false,
"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "https://MyDomain.onmicrosoft.com/",
    "TenantId": "b6909603-e5a8-497d-8fdb-7f10240fdd10",
    "ClientId": "6d09a1bf-4678-4aee-b67c-2d6df68d5324",
    "CallbackPath": "/signin-oidc",
    //Your Azure AD Security Group Object IDs that users needs to be member of to gain access
    "AuthorizedAdGroups": [
      "568bd325-283f-4909-9fcc-a493d19f98e8",
      "eee6d366-0f4d-4fca-9965-b2bc0770506d"
    ]
  }

(これらはランダムなガイドです)

匿名アクセス、Azure広告認証、認証+グループ承認が必要かどうかを条件付きで制御できるようになりました。 Azure広告アプリのマニフェストファイルを機能させるには、まだセットアップが必要なものがいくつかありますが、ここでは範囲外だと思います。

0
Morten_564834