我正在使用带有 Asp.Net Identity 2 的 Web Api 2.1。我试图在我的 ApiController 的构造函数上获取经过身份验证的用户(我正在使用 AutoFac 注入我的依赖项),但是在调用构造函数时用户显示为未经过身份验证。
我正在尝试获取用户,以便为任何数据库写操作生成审计信息。
我正在做的一些事情可以帮助诊断:
我只 app.UseOAuthBearerTokens
使用 Asp.Net Identity 2 作为身份验证。这意味着app.UseCookieAuthentication(new CookieAuthenticationOptions())
当您使用 Asp 创建新的 Web Api 2.1 项目时,我删除了默认启用的.Net 身份 2。
在里面WebApiConfig
我正在注入我的存储库:
builder.RegisterType<ValueRepository>().As<IValueRepository>().InstancePerRequest();
这是我的控制器:
[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...
}
}
但是,如果我在构造函数上检查 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
}
我注意到,如果我删除这一行:config.SuppressDefaultHostAuthentication()
User 被填充在构造函数中。
这是预期的吗?如何在构造函数上获取经过身份验证的用户?
编辑: 正如 Rikard 建议的那样,我试图让用户使用 Initialize 方法,但它仍然不可用,给了我图像中描述的相同内容。