簡単に言うと、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
{
...
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つの要件があり、それが常に合格することがわかります。
私はこれで終わります、助けるかもしれません:
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
{
これが私の解決策です:
コントローラの新しい属性:
[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広告アプリのマニフェストファイルを機能させるには、まだセットアップが必要なものがいくつかありますが、ここでは範囲外だと思います。