認証にトークンを使用する web.api サービスを構築しています。Dominick Baier が彼のブログで使用しているガイドラインに従っています。
今日、Owin、Entity Framework、ASP.NET web.api のすべてのパッケージを更新しましたが、多くの変更が行われていることがわかりました。
Web でいくつかの記事を見つけ (これらのトピックに関するドキュメントはないようです)、web.api サービスの変換を開始しました。
新しい ASP.NET Identity 2.0.0 に関するこの投稿は、ほとんどすべてを変換するのに役立ちましたが、今は単純なばかげた問題で立ち往生しています。
ブログで提案されているように、顧客のApplicationUserManagerとApplicationDbContextを作成できました。
私のスタートアップでは、2 つのオブジェクトを Owin コンテキストに関連付けました。
app.CreatePerOwinContext<ApplicationDatabaseContext>(ApplicationDatabaseContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Bearer Authenticationを使用したいので、カスタムOAuthAuthorizationServerProviderを定義しました。
var OAuthOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/Token"),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
Provider = new MyAuthorizationServerProvider(),
RefreshTokenProvider = new MyRefreshTokenProvider(DateTime.UtcNow.AddHours(8))
};
私のMyAuthorizationServerProviderでは、 ValidateClientAuthenticationをオーバーライドしました。これは、クライアントの資格情報を確認したいためです。
すべてが正常に動作しているようで、IAuthenticationManagerをOwinContextから取得できます。
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId = string.Empty;
string clientSecret = string.Empty;
if (context.TryGetBasicCredentials(out clientId, out clientSecret))
{
IAuthenticationManager manager = context.OwinContext.Authentication;
...
...
}
}
しかし、 ApplicationDbContextを取得できないようです。これを達成できる唯一の方法は、登録された変数を調べて見つけたキーを使用することです。
var dbContext = context.OwinContext.Get<ApplicationDbContext>("AspNet.Identity.Owin:OwinWebApiSecurity.Services.ApplicationDatabaseContext, OwinWebApiSecurity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
同じことを達成するためのより簡単な方法があるかどうか疑問に思っていました。