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?