17

OpenID Connect を実行しようとしています... Web API のユーザーが、OpenID Connect プロバイダーの認証コードを取得できました。このコードを ASP.NET Web API に渡すにはどうすればよいですか? 認証コードを使用してアクセス トークンを取得できるように、OWIN ミドルウェアをどのように構成する必要がありますか?

更新: SPA は、Web サービス (ASP.NET Web API) との通信に AJAX を使用します。私の Web サービスでは、OWIN ミドルウェアを使用しています。認証メカニズムとして OpenIDConnect を設定しました。Web サービスが初めて呼び出されたときに、ユーザーを OpenID Connect プロバイダーのログイン ページに正常にリダイレクトしました。ユーザーはログインでき、結果として認証コードを取得できました。私の知る限り、このコードは(私のWebサービスによって)アクセストークンに使用できるようになりました。ただし、このコードを Web サービスに戻す方法 (これはヘッダーを使用して行われますか?) と、アクセス トークンを取得するために構成する方法がわかりません。トークン エンドポイントを手動で呼び出すこともできると思いますが、代わりに OWIN コンポーネントを利用したいと考えています。

4

4 に答える 4

12

推奨されるアプローチは、AuthorizationCodeReceivedイベントを使用して認証コードをアクセス トークンに交換することです。 Vittorio は、全体の流れを概説するブログ エントリを持っています。

これをセットアップするためのコードのGitHub 上のサンプル アプリの例を次に示します。Startup.Auth.cs

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        ClientId = clientId,
        Authority = Authority,
        Notifications = new OpenIdConnectAuthenticationNotifications()
        {
            AuthorizationCodeReceived = (context) =>
           {
               var code = context.Code;
               ClientCredential credential = new ClientCredential(clientId, appKey);
               string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
               string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
               AuthenticationContext authContext = new AuthenticationContext(string.Format("https://login.windows.net/{0}", tenantID), new EFADALTokenCache(signedInUserID));
               AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                           code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceID);

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

注:このAuthorizationCodeReceivedイベントは、承認が実際に行われるときに 1 回だけ呼び出されます。認証コードがすでに生成されて保存されている場合、このイベントは呼び出されません。このイベントを強制的に実行するには、ログアウトするか Cookie をクリアする必要があります。

于 2014-08-12T18:29:53.730 に答える
1

カスタム承認を行うには、デフォルトの owin 検証をバイパスする必要があります。

           new OpenIdConnectAuthenticationOptions
            {
                ...,
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidateIssuer = false
                },
于 2015-09-02T21:14:46.833 に答える
0
TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name", RoleClaimType = ClaimTypes.Role },

このコード行は私の問題を解決しました。発行者が偽であることを検証する必要があります。

于 2021-03-31T11:05:49.877 に答える