基本的な考え方はMVC5と同じだが、MVC6で認証もサービスになったので忘れないようにメモ。
ちなみに、VS2015でテンプレートを利用すれば予め認証関連を自動生成してくれる...が業務アプリではなかなか使えないのが悲しいなぁ。

参考URL:https://github.com/leastprivilege/AspNet5AuthorizationPlayground

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 認証されたUser以外はアクセス禁止 -->
        var defaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();

        services.AddMvc(setup =>
        {
            setup.Filters.Add(new AuthorizeFilter(defaultPolicy));
        });
        // <-- 認証されたUser以外はアクセス禁止

        // 必要があればリソースに対するアクセス権(ACL)の設定
        // DBで管理しているのなら、ここでDBから取得してセットする感じ?
        services.AddAuthorization(options =>
        {
            // ポリシー「SalesOnly」の設定
            options.AddPolicy("SalesOnly", policy =>
            {
                //部署がsales
                policy.RequireClaim("department", "sales");
            });
            // ポリシー「SalesSenior」の設定
            options.AddPolicy("SalesSenior", policy =>
            {
                //部署がsales
                policy.RequireClaim("department", "sales");
                //ステータスがsenior
                policy.RequireClaim("status", "senior");
            });
            // ポリシー「DevInterns」の設定
            options.AddPolicy("DevInterns", policy =>
            {
                //独自の実装による権限チェックの登録
                policy.AddRequirements(new StatusRequirement("development", "intern"));

                // ..or using extension method
                //policy.RequireStatus("development", "intern");
            });
        });

        // リソースに対する認証のハンドル登録
        services.AddTransient<IAuthorizationHandler, CustomerAuthorizationHandler>();
        services.AddTransient<IAuthorizationHandler, ProductAuthorizationHandler>();

        // リソースに対するアクセス権のハンドル登録
        services.AddTransient<IPermissionService, TestPermissionService>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseIISPlatformHandler();
        app.UseDeveloperExceptionPage();
        
        // クッキーを使った認証の永続化宣言
        app.UseCookieAuthentication(options =>
        {
            options.LoginPath = "/account/login";
            options.AccessDeniedPath = "/account/forbidden";
            options.AuthenticationScheme = "Cookies";
            options.AutomaticAuthenticate = true;
            options.AutomaticChallenge = true;
        });

        app.UseStaticFiles();
        app.UseMvcWithDefaultRoute();
    }
}

ログイン成功時の処理

//ClaimsにはKeyとValueで任意の情報を設定
var claims = new List<Claim>
{
    new Claim("sub", "1"),
    new Claim("name", "Alice"),
    new Claim("email", "alice@smith.com"),
    new Claim("status", "senior"),
    new Claim("department", "sales"),
    new Claim("region", "south"),
    new Claim("role", "supervisor")
};

// Claims : 上記で設定した情報
// "local" : 認証の種類
// "name" : 上記の情報の中で名前を表すKey
// "role" : 上記の情報の中でロールを表すKey
var id = new ClaimsIdentity(claims, "local", "name", "role");

// プリンシパルをクッキーに登録
await HttpContext.Authentication.SignInAsync("Cookies", new ClaimsPrincipal(id));

これでHttpContext.Userに認証情報が登録されるので、以降はコントローラやViewでUserを利用できる。Userの実体はSystem.Security.Claims.ClaimsPrincipal

ログアウト時の処理

// プリンシパル削除
await HttpContext.Authentication.SignOutAsync("Cookies");

これで全コントローラーのアクションは、認証が行われていなければアクセスしても/account/forbiddenに遷移する。
認証を必要としないアクションには、AllowAnonymous属性を付与すれば良い。

ACLのチェックの実装

実際にACLのチェックを行うのは、以下の様な実装となる。

public CustomerController(IAuthorizationService authz)
{
    _authz = authz;
}
    
public async Task<IActionResult> Manage()
{
    ....
    
    if (await _authz.AuthorizeAsync(this.User, customer, CustomerOperations.Manage))
    {
        return View("success");
    }
    //例えば、認証にTwitterとかも利用していれば、そちらの認証をデリゲートする場合?
    return new ChallengeResult();
}

認証状態の取得

User.Identity.IsAuthenticatedで認証の有無を確認できる。

<div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
        <li><a asp-controller="Home" asp-action="Index">Home</a></li>
        @if (User.Identity.IsAuthenticated)
        {
            <li><a asp-controller="Account" asp-action="Logoff">Logoff</a></li>
        }
        
    </ul>
</div>

権限の取得

User.IsInRole("supervisor")で権限の有無を確認できる。

ここでのAdminは、ClaimsIdentityを作成した際にroleTypeに指定したClaimのKey「role」に定義した内容。

ACLのハンドラ実装

まだ、よく理解できてない部分もあるので理解できたら後日また書きます(;・∀・)