使用依赖项注入在每个http请求时实现新的AuthorizationServerProvider

时间:2017-05-08 18:33:56

标签: c# entity-framework asp.net-web-api2 asp.net-identity

我有一个web api 2项目,我使用的是Asp.net Identity and Entity框架。 我发现当我更改密码时,旧密码仍然有效,但新密码会给我错误(无效授权)。

我确定更改密码正常工作...实际上在数据库中,(哈希)密码的值会正确更改。

更新

我明白了为什么。 {http:1}}(或我在其中使用的用户管理器)不是每个http请求实例化的。它似乎是一个单身人士。问题是它在启动和停止时是实例化的,所以就像它继续使用第一次登录的数据一样,这些数据被缓存(由实体框架)。

这是我如何配置authorizationServerProvider类:

authorizationServerProvider

如何避免登录使用缓存数据?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以尝试:

  • 使用AsNoTracking()

  • 禁用跟踪
  • 丢弃DbContext并创建一个新的

  • 调用GetDatabaseValues()以获取单个实体的更新值

答案 1 :(得分:0)

我遇到了与UseOAuthAuthorizationServer和DI相同的问题。上次我在使用Autofac时遇到这个问题,但这与其他DI框架有关。问题是我们有中间件存储的OAuthAuthorizationServerProvider的静态实例,因此不涉及DI。 我的解决方案是在每个方法中获取OAuthAuthorizationServerProvider中的依赖项,如下所示:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var scope = context.OwinContext.GetAutofacLifetimeScope();
    var userManager = scope.Resolve<ApplicationUserManager>();

    .........
}

我的容器初始化:

    public static IContainer Configure(IAppBuilder appBuilder, HttpConfiguration config)
    {
        var containerBuilder = new ContainerBuilder();
        .... registrations here ....

        var container = containerBuilder.Build();

        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        appBuilder.UseAutofacMiddleware(container);

        appBuilder.UseAutofacWebApi(config);

        return container;
    }

你也可以使用其他DI容器做这样的事情。