6.10.2. Native アプリケーション (C#)¶
.NET(C#) による OpenID Connect 認証の実装方法を記載します。
大きく分けて、以下の4つの処理を実装します。
- OpenID Connect 認証結果を受け取るためのリスナーを作成
- OpenID Connect 認証開始 REST API の実行
- OpenID Connect 認証完了時の処理
- BaaS サーバへのログイン
リスナー登録¶
OpenID Connect 認証結果を受け取るための HTTP リスナー(1種のローカルWebサーバ)を作成します。
string redirectUri = "http://localhost:8080/receiveToken/";
// HTTPリスナー作成
HttpListener listener = new HttpListener();
listener.Prefixes.Clear();
listener.Prefixes.Add(redirectUri);
// リスナー開始
listener.Start();
OpenID Connect の認証が完了すると、指定したリダイレクトURL に対して認証サーバからHTTPリダイレクトで認証結果が転送されますので、 これを HTTP リスナーで受け取れるようにします。
リダイレクトURLは http://localhost:
で開始する必要があります。
ポート番号やパスは任意です。
OpenID Connect認証開始¶
ブラウザを起動して OpenID Connect 認証開始の REST API を実行します。
REST API の URI は、以下のとおりです。
{endpointUri}/1/{tenantId}/auth/oidc/start?op={op}&redirect={redirectUri}&scope={scope}&createUser={true|false}&sessionToken={sessionToken}
- op、redirectUri は必須です。
- op は連携する OpenID Connectプロバイダを指定します。設定可能な値は以下の通りです。
- google: Google
- adfs: ADFS (Windows Server 2016)
- other: OpenAM
- redirectUri には、上述したリダイレクトURLを指定してください。
- OIDC認証ユーザを作成する場合は、createUser=true を指定してください。
- 作成済ユーザとのアカウントリンク設定をする場合は、sessionToken にリンクさせたいユーザのセッショントークンを指定してください。
- scope はオプションです。取得したい属性情報(OpenID Connectスコープ)を指定します。必ず "openid" が含まれている必要があります。
redirectUri, scope については、いずれもURIエンコードが必要な点に注意してください。
以下にサンプルコードを示します。
string encodeUri = System.Web.HttpUtility.UrlEncode(redirectUri);
string scope = "{Scope値}"
string encodeScope = string.IsNullOrEmpty(scope) ? "" : System.Web.HttpUtility.UrlEncode(scope);
// ブラウザを起動して REST API 実行
string path = <EndpointUrl> + "/1/" + <tenantId> + "/auth/oidc/start" + "?redirect=" + encodeUri + "&op=" + <op> + "&createUser=true";
path = encodeScope.Length == 0 ? path : path + "&scope=" + encodeScope;
System.Diagnostics.Process.Start(path);
OpenID Connect認証完了時の処理¶
OpenID Connect 認証が完了すると、指定したリダイレクト URI にリダイレクトされます。 リダイレクト URI は以下のようにワンタイムトークンがクエリパラメータに格納された形になります。
http://localhost:8080/receiveToken?token=123456789abcdef
リダイレクト URI からワンタイムトークンを取り出します。 以下にサンプルコードを示します。
// リクエスト待ち
HttpListenerContext context = listener.GetContext();
// リクエスト取得
HttpListenerRequest req = context.Request;
// リクエスト文字列取得
string reqStr = req.RawUrl;
// ワンタイムトークン取得
string onetimeToken = req.QueryString.Get("token");
BaaS サーバへのログイン¶
ワンタイムトークンを指定してログインします。
サーバからセッショントークンが払いだされ、以降は本セッショントークンで認証が行われます。 以下にサンプルコードを示します。
// ログイン用のパラメータ作成
var param = new NbUser.LoginParam() { Token = onetimeToken };
// ログイン
var user = await NbUser.LoginAsync(param, service);