当前位置:  开发笔记 > 编程语言 > 正文

为什么在解析WebApi时没有加载标识,而是在解析Mvc控制器时

如何解决《为什么在解析WebApi时没有加载标识,而是在解析Mvc控制器时》经验,为你挑选了0个好方法。

我正在使用Autofac进行Inversion of Control容器,其配置如下

    public void Configuration(IAppBuilder app) {
        configureIoC(app);
        configureAuth(app);
    }

    void configureIoC(IAppBuilder app) {
        var b = new ContainerBuilder();
        //...
        b.Register(c => HttpContext.Current?.User?.Identity 
                    ?? new NullIdentity()).InstancePerLifetimeScope();
        var container = b.Build();
        app.UseAutofacMiddleware(container);
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    }

我相信这是Autofac与其他容器的事实可能与我所看到的无关.在这里,他们重点线是一个配置上的任何依赖IIdentity从采摘HttpContext.Current.

我这样使用它,这样我就可以随时随地访问当前用户.

public interface ICurrentUser {
    Task Get();
}
public class CurrentUserProvider : ICurrentUser {
    public async Task Get() => await users.FindByNameAsync(currentLogin.GetUserId());

    public CurrentUserProvider(AppUserManager users, IIdentity currentLogin) {
        this.users = users;
        this.currentLogin = currentLogin;
    }

}

我在过去的项目中使用了这种模式,它运行良好.我正在将它应用于现有项目并看到一个非常奇怪的事情.

当一个Asp.net Mvc控制器依赖于ICurrentUser一切正常

的WebAPI控制器获取实例ICurrentUserGet,因为实例操作失败,IIdentity尚未从cookie解析,还没有装进去索赔(AuthenticationType == null)!奇怪的是,如果我在实例化WebApi控制器后暂停调试器,我可以HttpContext.Current.User.Identity看到AuthenticationType == "Cookie"并且所有声明都存在.

这导致我得出的结论是,某些事情按以下顺序发生

如果这是web api路由,则Web Api控制器会创建一个实例

Asp.Net Identity填写当前HttpContext身份

如果这是一个mvc路由,则mvc控制器会创建一个实例

执行任何操作

这当然毫无意义!

所以问题如下

    我对管道中事物顺序的推断是否正确?

    如何控制它才能正常工作?为什么这会对其他项目起作用,但会在这里造成问题?我是否以错误的顺序连接了什么?

请不要建议我创建一个IdentityProvider迟到的解决方案IIdentity.我理解如何解决这个问题,我不明白为什么会发生这种情况以及如何控制事物的管道顺序.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有