我正在构建一个使用令牌进行授权的web.api服务。我遵循了Dominick Baier在他的博客中使用的指导方针。
今天,我更新了Owin、Entity Framework和ASP.NET web.api的所有软件包,发现很多东西都发生了变化。
我在网上找到了一些文章(显然没有关于这些主题的文档),并开始转换我的web.api服务。
这篇关于新的ASP.NET Identity 2.0.0的帖子帮助我转换了几乎所有的东西,但现在我陷入了一个简单而愚蠢的问题。
我已经按照博客中的建议创建了我的客户ApplicationUserManager和ApplicationDbContext。
在我的启动中,我已将我的2对象与Owin上下文关联:
app.CreatePerOwinContext<ApplicationDatabaseContext>(ApplicationDatabaseContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
我定义了一个自定义的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,因为我想检查客户端凭据。
一切似乎都很好,我可以从OwinContext:获得我的IAuthenticationManager
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");
我想知道是否有更简单的方法来实现同样的事情。
显然,我必须导入Microsoft.AspNet.Identity.Owin命名空间才能访问这些扩展方法。
ApplicationDbContext dbContext = context.OwinContext.Get<ApplicationDbContext>();
ApplicationUserManager userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();