私はMVCアプリケーションでOAuth2 client_credentialsフローを実装しました。このシナリオでは、MVCアプリケーションは実際にはリソースです。このフローは主にAPIアクセスに使用されていたため、この特定の使用例のサンプルを確保するのは非常に困難でしたが、それでもやっていました。
私が気づいていない可能性のある脆弱性に関する情報を求めるために、実装の詳細をあなたと共有したいと思います。私は決してセキュリティ専門家ではありません。それが私をここに連れてきました。
.NET Framework 4.5.2では、Microsoft.Owinライブラリv3.0.1を使用しました。私は、この種のもの(.NET CoreやIdentityServer4など)を設定するための新しい方法があることを知っていますが、この特定のユースケースで実行可能なサンプルを見つけるのは難しいと言いました。以下のスタートアップコードとクライアントクレデンシャルとOWINミドルウェアを使用する際の脆弱性OAuth
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
private ClientService clientService;
public ApplicationOAuthProvider()
{
this.clientService = new ClientService();
}
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId;
string clientSecret;
context.TryGetFormCredentials(out clientId, out clientSecret);
if (clientId == "XXXX" && clientSecret == "XXXXX")
{
context.Validated(clientId);
}
return base.ValidateClientAuthentication(context);
}
public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
{
var client = clientService.GetClient(context.ClientId);
var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, client.ClientName));
var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
context.Validated(ticket);
//context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
return base.GrantClientCredentials(context);
}
:
私はプロバイダを実装
public partial class Startup
{
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
static Startup()
{
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60),
//AllowInsecureHttp = true,
AuthenticationMode = AuthenticationMode.Active,
};
}
public void ConfigureAuth(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll)
.UseOAuthBearerTokens(OAuthOptions);
//app.UseOAuthBearerTokens(OAuthOptions);
}
}
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
ConfigureAuth(app);
}
}
、その後も、ウェブサイトでのクライアントアプリケーションを作成し、最終的にリソース(MVCアプリ)へのアクセスを得ました。リソースにはユーザーがないため、ログイン画面はありません。リソース(現在)にトークンエンドポイントがあります。クライアントアプリケーションは、トークンエンドポイントに対して資格情報を要求し、(認証された後に)そのトークンをリソースへの後続の要求で使用します。
このトークンを使用してアクセスするには2通りの方法があります。
- リクエストヘッダーにアクセストークンを含めます。
は、クライアント・アプリケーションとサーバ間のすべての通信を想定すると、セキュアチャネル(HTTPS)と、クライアント上で起こっている:OR - は、私の質問は、このシナリオに脆弱性に関するしているフォームパラメータ
としてアクセストークンを含めますアプリは安全な方法でクレデンシャルを維持することができますが、アクセストークンを取得または傍受する可能性は何ですか?または、このフローに含まれるメソッド(または別のOAuthフロー)にクライアント検証も含まれていますか?私はクライアントがすでにclient_id/client_secretで認証されていることを認識していますが、私が検証について尋ねるとき、私は要求の起点について尋ねています(検証方法には偽装可能なもの悪意のあるユーザーによる)。
私は欠席している可能性があることを含めるべきであることを確認するための追加のステップがありますか?そこに多くの情報があり、徹底的に捜索するためでしたが、私はすべてのことをしっかりと理解していますこれまで読んだことがあります。
私が見逃した追加の確認ステップがある場合、それはどのようにこの(client_credentials)フローに適合しますか?
おかげで、 キャリー
これを書き留める時間をとっていただきありがとうございます。それは本当に私のためにたくさんのものを結びつけてくれました! – codenewbie