用户(IPrincipal)在ApiController的构造函数上不可用,使用Web Api 2.1和Owin

Mah*_*Ali 12 c# owin katana asp.net-web-api2 asp.net-identity-2

我正在使用带有Asp.Net Identity 2的Web Api 2.1.我试图在我的ApiController的构造函数上获取经过身份验证的用户(我使用AutoFac来注入我的依赖项),但是在调用构造函数时,User显示为未经过身份验证.

我试图获取用户,以便我可以为任何数据库写操作生成审计信息.

我正在做的一些事情可以帮助诊断:
app.UseOAuthBearerTokens使用Asp.Net Identity 2进行身份验证.这意味着app.UseCookieAuthentication(new CookieAuthenticationOptions())当您使用Asp创建新的Web Api 2.1项目时,我删除了默认启用的功能. .Net Identity 2.

在里面WebApiConfig我正在注入我的存储库:

builder.RegisterType<ValueRepository>().As<IValueRepository>().InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
    private IValueRepository valueRepository;

    public ValuesController(IValueRepository repo)
    {
        valueRepository = repo;
        // I would need the User information here to pass it to my repository
        // something like this:
        valueRepository.SetUser(User);
    }

    protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);

        // User is not avaliable here either...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我检查构造函数上的User对象,这就是我得到的: 用户

身份验证正在运行,如果我没有通过我的令牌,它将响应Unauthorized.如果我传递令牌并尝试从任何方法访问用户,则会对其进行身份验证并正确填充.它只是在调用时没有显示在构造函数上.

在我的WebApiConfig使用中:

public static void Register(HttpConfiguration config)
{
    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

     // ... other unrelated injections using AutoFac
 } 
Run Code Online (Sandbox Code Playgroud)

我注意到如果我删除这一行:config.SuppressDefaultHostAuthentication()用户填充在构造函数上.

这是预期的吗?如何在构造函数上获取经过身份验证的用户?

编辑: 正如Rikard建议我试图让用户使用Initialize方法,但它仍然无法使用,给我的图像中描述的内容相同.

Bar*_*jen 5

这个问题确实在于config.SuppressDefaultHostAuthentication()

本文由布鲁克-阿伦很好地解释这是为什么。该方法有意将主体设置为null,以使默认身份验证(例如cookie)不起作用。相反,网络API认证过滤器则需要认证部分的护理。

当您没有Cookie身份验证时,可以删除此配置。

此处提到的一种巧妙的解决方案是确定应用程序的Web API部分的范围,以便您可以将此配置仅分离到特定路径:

public void Configuration(IAppBuilder app)
{
    var configuration = WebApiConfiguration.HttpConfiguration;
    app.Map("/api", inner =>
    {
        inner.SuppressDefaultHostAuthentication();
        // ...
        inner.UseWebApi(configuration);
    });
}
Run Code Online (Sandbox Code Playgroud)


Rik*_*ard 3

控制器的 User 属性只有在调用构造函数之后调用 Initialize 方法时才会填充,因此这就是为什么 Identity 尚未填充授权用户数据的原因。