ASP.NET Coreの実装(Webアプリ + SSO)

ASP.NET Coreの実装で使用する全ソースコードは、こちらのGitHubリポジトリでご覧いただけます。

クッキーおよびOIDCミドルウェアを構成する

このガイドの目的のために、シンプルなホスト型ログインを使用します。標準クッキーと、ASP.NET Coreで利用できるOIDCミドルウェアを使用できるため、NuGetパッケージをインストールしてください。

Install-Package Microsoft.AspNetCore.Authentication.Cookies
Install-Package Microsoft.AspNetCore.Authentication.OpenIdConnect

Was this helpful?

/

その後、アプリケーションのミドルウェアパイプライン内でクッキーとOIDCミドルウェアを構成します。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add authentication services
        services.AddAuthentication(
            options => options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme);

        // Code omitted for brevity...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<Auth0Settings> auth0Settings)
    {
        // Code omitted for brevity...

        // Add the cookie middleware
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AutomaticAuthenticate = true,
            AutomaticChallenge = true
        });

        // Add the OIDC middleware
        app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
        {
            // Set the authority to your Auth0 domain
            Authority = "https://{yourDomain}/",

            // Configure the Auth0 Client ID and Client Secret
            ClientId = {yourClientId},
            ClientSecret = YOUR_CLIENT_SECRET,

            // Do not automatically authenticate and challenge
            AutomaticAuthenticate = false,
            AutomaticChallenge = false,

            // Set response type to code
            ResponseType = "code",

            CallbackPath = new PathString("/signin-auth0"),

            // Configure the Claims Issuer to be Auth0
            ClaimsIssuer = "Auth0"
        });

        // Code omitted for brevity...
    }
}

Was this helpful?

/

上記のコードでは、2つの異なるタイプの認証ミドルウェアを構成しました。

1つ目は、UseCookieAuthenticationの呼び出しに登録されたクッキーミドルウェアです。2つ目は、UseOpenIdConnectAuthenticationの呼び出しで実行されるOIDCミドルウェアです。

ユーザーがOIDCミドルウェアを使用してAuth0にサインインすると、ユーザーの情報はセッションクッキー内に自動的に保存されます。上記の通りにミドルウェアを構成するだけで、ユーザーセッションは管理されます。

OpenID Connect(OIDC)ミドルウェアはまた、ユーザーが認証されたらAuth0から送信されるIDトークンからクレームすべてを抽出し、それをClaimsIdentityのクレームとして追加します。

ログアウトを実装する

AuthenticationManagerクラスのSignOutAsyncメソッドを使用し、サインアウトしたい認証スキームを伝えて、アプリケーションセッションとAuth0セッションの両方をコントロールできます。

クッキーミドルウェアのサインアウトと、それによるアプリケーションの認証クッキーの消去の例として、以下の呼び出しを作成できます。

await HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

Was this helpful?

/

同様に、SignOutAsyncメソッドを呼び出し、サインアウトするために認証スキームとしてAuth0を伝えることで、ユーザーをAuth0からログアウトできます。

await HttpContext.Authentication.SignOutAsync("Auth0");

Was this helpful?

/

ただし上記が機能するためには、OnRedirectToIdentityProviderForSignOutイベントを処理して、OIDCミドルウェアを登録するときに別の構成を追加する必要があります。イベント内で、Auth0クッキーを消去するAuth0ログアウトエンドポイントにリダイレクトする必要があります。

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
{
    // Some code omitted for brevity
    Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProviderForSignOut = context =>
        {
            context.Response.Redirect($"https://{auth0Settings.Value.Domain}/v2/logout?client_id={auth0Settings.Value.ClientId}&returnTo={context.Request.Scheme}://{context.Request.Host}/");
            context.HandleResponse();

            return Task.FromResult(0);
        }
    }
});

Was this helpful?

/

また、Auth0 Dashboard内のアプリケーションのために、アプリケーションのURLを[Allowed Logout URLs(許可されているログアウトURL)]に追加する必要があります。詳細については、ログアウトを参照してください。

管理者権限の実装

グループをASP.NET Coreアプリケーションに組み入れる最も簡単な方法は、ASP.NET Coreで利用可能な組み込みのロールベースの認可を使用することです。これを達成するには、ユーザーが割り当てられるそれぞれのグループについて、

http://schemas.microsoft.com/ws/2008/06/identity/claims/role

Was this helpful?

/

上記タイプのクレームを追加する必要があります。

クレームが追加されたら、クレームを[Authorize(Roles = "Admin")]属性で装飾することで、簡単に特定のアクションをAdminのみに利用可能にできます。また、コントローラー内でUser.IsInRole("Admin")を呼び出して、ユーザーがコードの特定のロールかどうかを確認できます。

ASP.NET OIDCミドルウェアは、JWTで返されたすべてのクレームを、クレームとしてClaimsIdentityに自動的に追加します。このため、authorizationクレームから情報を抽出し、クレームのJSONボディーを逆シリアル化して、グループごとに、http://schemas.microsoft.com/ws/2008/06/identity/claims/roleクレームをClaimsIdentityに追加する必要があります。

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
{
    // Some configuration omitted for brevity

    Events = new OpenIdConnectEvents
    {
        OnTicketReceived = context =>
        {
            var options = context.Options as OpenIdConnectOptions;

            // Get the ClaimsIdentity
            var identity = context.Principal.Identity as ClaimsIdentity;
            if (identity != null)
            {
                // Add the groups as roles
                var authzClaim = context.Principal.FindFirst(c => c.Type == "authorization");
                if (authzClaim != null)
                {
                    var authorization = JsonConvert.DeserializeObject<Auth0Authorization>(authzClaim.Value);
                    if (authorization != null)
                    {
                        foreach (var group in authorization.Groups)
                        {
                            identity.AddClaim(new Claim(ClaimTypes.Role, group, ClaimValueTypes.String, options.Authority));
                        }
                    }
                }
            }

            return Task.FromResult(0);
        }
    }
});

Was this helpful?

/

その後、管理者にタイムシートの承認を許可するアクションを追加できます。

[Authorize(Roles = "Admin")]
public IActionResult TimesheetApproval()
{          
    return View();
}

Was this helpful?

/