web-dev-qa-db-ja.com

ASP.NET Coreは、web.configを介してADグループを承認します

私の古い.NET MVCアプリでは、IISでWindows認証を有効にし、匿名を無効にしました。次に、web.configファイル私はこれに入れなければなりませんでした:

<authorization> 
  <allow roles="Domain\MyADGroupToHaveAccess" />
  <deny users="*" /> 
</authorization> 

.NET Core 2.0ではこれは機能しません。匿名は正しく拒否されますが、何があってもすべてのユーザーを許可します。

私がこれをすると:

[Authorize(Roles = "Domain\\MyADGroupToHaveAccess")]

私のHomeControllerでは機能しますが、他の環境で変更する必要があるため、プロジェクトでこの設定をハードコーディングしたくありません。

どうすればweb.config AD Authorizationを使用しますか?または、ASP.NET Coreでこの設定をハードコーディングしない別の方法はありますか?

8
Morten_564834

appsettings.jsonを呼び出せるポリシーにすることで解決しました。このようにして、サーバーにアクセスできる他のユーザーは、グループを自分のグループに編集できます。

Startup.cs

services.AddAuthorization(options =>
{
    options.AddPolicy("ADRoleOnly", policy => policy.RequireRole(Configuration["SecuritySettings:ADGroup"]));
});

services.AddMvc(config =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();

    config.Filters.Add(new AuthorizeFilter(policy));
});

appsettings.json(または、異なる場合はおそらくappsettings.production.json):

"SecuritySettings": {
  "ADGroup": "YourDomain\\YourADGroup"
}

コントローラーでは、次の属性で装飾できます。

[Authorize(Policy = "ADRoleOnly")]

これが他の人の役に立つことを願っています

私はまだこのポリシーをグローバルに適用する方法を理解する必要があるので、すべてのコントローラーを承認する必要はありません。services.AddMvcで何とかできると思いますか?

19
Morten_564834

Morten_564834の答えをさらに詳しく説明するために、この問題に対する私たちのアプローチを示します。すべてのコントローラーが継承するベースコントローラーを作成します。

[Authorize(Policy = "AdUser")]
public class FTAControllerBase : Controller
{
    private readonly ApplicationDbContext _db;
    private readonly ILogHandler _logger;

    public FTAControllerBase(ApplicationDbContext DbContext, ILogHandler Logger, IWindowsAccountLinker WinAccountLinker)
    {
        _db = DbContext;
        _logger = Logger;

        /// get registered user via authenticated windows user.
        //var user = WinAccountLinker.LinkWindowsAccount();
    }
}

次に、他のコントローラーで:

public class LettersController : FTAControllerBase
{ ... }

メソッドに対するきめ細かなアクセス許可が必要な場合:

[Authorize("GenerateLetterAdUser")]
[HttpGet]
public IActionResult Generate()
{
    return View();
}

Startup.cs:

// add authorization for application users
var section = Configuration.GetSection($"AuthorizedAdUsers");
var roles = section.Get<string[]>();
services.AddAuthorization(options =>
{
    options.AddPolicy("AdUser", policy => policy.RequireRole(roles));
});

AppSettings.json:

"AuthorizedAdUsers": [
"domain\\groupname"
],
2
sam