在我的自定义OAuthAuthorizationServerProvider中的ValidateClientAuthentication期间获取IdentityDbContext

时间:2014-04-09 22:52:35

标签: c# asp.net-identity owin asp.net-identity-2

我正在构建一个使用令牌进行授权的web.api服务。 我已遵循Dominick Baier在其博客here中使用的指南。

今天我已经更新了Owin,Entity Framework和ASP.NET web.api的所有软件包,并且我发现很多东西已经发生了变化。

我在网上发现了一些文章(显然没有关于这些主题的文档)并开始转换我的web.api服务。

关于新的ASP.NET Identity 2.0.0的这个post帮助我转换了几乎所有东西,但现在我被困在一个简单的愚蠢的事情上。

我设法按照博客中的建议创建了我的客户 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");

我想知道是否有更简单的方法来实现同样的目标。

1 个答案:

答案 0 :(得分:9)

显然我必须导入 Microsoft.AspNet.Identity.Owin 命名空间才能访问这些扩展方法。

ApplicationDbContext dbContext = context.OwinContext.Get<ApplicationDbContext>();
ApplicationUserManager userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();