Identity Server 3を共有セキュリティ トークン サービスとして使用する ASP.NET MVC サイトがいくつかあります。
これらのサイトには、独自のローカル ログイン ページが必要です。現在、WS-Trust を使用して Identity Server 2 で認証していますが、Identity Server 3 で OpenID Connect を使用するようにアップグレードしたいと考えています。
OpenID Connect がこのようなアクティブ認証をサポートしている状況を見つけることができなかったため、代わりに OAuth2 リソース オーナー フローを追求しました。
これを解決するための私の最初の試みは次のとおりです。
Startup.cs
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
TicketDataFormat = new AuthTicketDataFormat(),
AuthenticationType = Auth.ssoAuthenticationType,
LoginPath = new PathString("/account/login"),
CookieName = ConfigurationManager.AppSettings["SsoCookieName"],
CookiePath = "/",
CookieDomain = ConfigurationManager.AppSettings["SsoCookieDomain"],
});
AccountController.Login (投稿) には次のものがあります。
var client = new TokenClient(
ssoBaseUrl + "/connect/token",
ssoClientId,
ssoClientSecret);
var token = client.RequestResourceOwnerPasswordAsync(userName, password, ssoScope).Result;
var client = new HttpClient();
client.SetBearerToken(token.AccessToken);
var token = client.GetStringAsync(ssoBaseUrl + "/connect/userinfo").Result;
var jwt = new JwtSecurityToken(new JwtHeader(), JwtPayload.Deserialize(token));
var claims = jwt.Claims;
var id = new ClaimsIdentity(claims, Auth.ssoAuthenticationType, "email", "roles");
Request.GetOwinContext().Authentication.SignIn(id);
これは機能しますが...プロセスを簡素化するowinコンポーネントが必要であると考えました。たとえば、次の拡張メソッドを確認できますが、上記のものを置き換えるものはないようです。
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions {})
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions{})
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions{})
app.UseOpenIdConnectAuthentication(
new Microsoft.Owin.Security.OpenIdConnect.OpenIdConnectAuthenticationOptions{})
これらの拡張メソッドは、私たちの状況で機能するように最善を尽くしたにもかかわらず、トークンと userinfo エンドポイントに手動でアクセスし、起動時に Cookie 認証を行う上記の作業コードの必要性に取って代わるようには見えませんでした。
何か不足しているのでしょうか、それとも私たちのソリューションがこの状況に最適なものでしょうか...独自のログインページを使用したアクティブ認証ですが、それを実現するために最新のセキュリティ技術 (OpenID 接続 / OAuth2) を使用していますか?