承認サーバーによって保護されるWeb API(REST)のセットを開発しました。許可サーバーは、クライアントIDとクライアントシークレットを発行しました。これらを使用して、アクセストークンを取得できます。有効なトークンは、リソースサーバー(REST API)への後続の呼び出しで使用できます。
APIを使用するWebベース(Asp.net MVC 5)のクライアントを作成したい。クライアントOAuth2フローを実装するのに役立つ、ダウンロード可能なnugetパッケージはありますか?誰もがOAuth2フローのクライアント実装(asp.net MVCで書かれた)の良い例に私を導くことができますか?
更新以下のコードブロックを使用してアクセストークンを取得できましたが、必要なのは「クライアント資格情報」ですoauth 2フローは必要ありませんログインとパスワードを入力します。現在のコードは次のとおりです。
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType("ClientCookie");
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = "ClientCookie",
CookieName = CookieAuthenticationDefaults.CookiePrefix + "ClientCookie",
ExpireTimeSpan = TimeSpan.FromMinutes(5)
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = OpenIdConnectAuthenticationDefaults.AuthenticationType,
SignInAsAuthenticationType = app.GetDefaultSignInAsAuthenticationType(),
ClientId = ConfigurationManager.AppSettings["AuthServer:ClientId"],
ClientSecret = ConfigurationManager.AppSettings["AuthServer:ClientSecret"],
RedirectUri = ConfigurationManager.AppSettings["AuthServer:RedirectUrl"],
Configuration = new OpenIdConnectConfiguration
{
AuthorizationEndpoint = "https://identityserver.com/oauth2/authorize",
TokenEndpoint = "https://identityserver.com/oauth2/token"
},
//ResponseType = "client_credentials", // Doesn't work
ResponseType = "token",
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = notification =>
{
if (string.Equals(notification.ProtocolMessage.Error, "access_denied", StringComparison.Ordinal))
{
notification.HandleResponse();
notification.Response.Redirect("/");
}
return Task.FromResult<object>(null);
},
AuthorizationCodeReceived = async notification =>
{
using (var client = new HttpClient())
{
//var configuration = await notification.Options.ConfigurationManager.GetConfigurationAsync(notification.Request.CallCancelled);
String tokenEndPoint = "https://identityserver.com/oauth2/token";
//var request = new HttpRequestMessage(HttpMethod.Post, configuration.TokenEndpoint);
var request = new HttpRequestMessage(HttpMethod.Post, tokenEndPoint);
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ OpenIdConnectParameterNames.ClientId, notification.Options.ClientId },
{ OpenIdConnectParameterNames.ClientSecret, notification.Options.ClientSecret },
{ OpenIdConnectParameterNames.Code, notification.ProtocolMessage.Code },
{ OpenIdConnectParameterNames.GrantType, "authorization_code" },
{ OpenIdConnectParameterNames.RedirectUri, notification.Options.RedirectUri }
});
var response = await client.SendAsync(request, notification.Request.CallCancelled);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
// Add the access token to the returned ClaimsIdentity to make it easier to retrieve.
notification.AuthenticationTicket.Identity.AddClaim(new Claim(
type: OpenIdConnectParameterNames.AccessToken,
value: payload.Value<string>(OpenIdConnectParameterNames.AccessToken)));
}
}
}
});
}
}
クライアント資格情報の付与タイプをサポートするための最善のオプションは、おそらくHttpClient
を直接使用することです。
var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/token");
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ "client_id", "your client_id" },
{ "client_secret", "your client_secret" },
{ "grant_type", "client_credentials" }
});
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
var token = payload.Value<string>("access_token");
インタラクティブフロー(認証コードフローなど)には、2つの優れたアプローチがあります。
認可サーバーがOpenID Connect(OAuth2に基づく)をサポートしている場合、Microsoftが開発したOWIN/Katana 3用のOpenID Connectミドルウェアを使用できます。 https://www.nuget.org/packages/Microsoft。 Owin.Security.OpenIdConnect /
OpenID Connectが認証サーバーでサポートされていない場合、1つのオプションは、独自のOAuth2クライアントミドルウェアを作成することです。この最後の部分をご覧くださいSO詳細についての答え: OWIN Identityを使用した複数のAPIクライアントからのWeb API 2外部ログインの登録