我的 WebAPI 2 应用程序有一个自定义授权过滤器,用于检查访问令牌。如果令牌存在,并且 API 具有该属性,那么我检查是否存在映射到该令牌的用户。
由于 API 的性质,大多数方法在特定用户的上下文中运行(即“POST api/profile”以更新用户的配置文件)。为此,我需要从访问令牌中获得的目标用户信息。
[当前实现,发生在 AuthorizeAttribute 类型的属性中]
if( myDBContext.MyUsers.Count( x => x.TheAccessToken == clientProvidedToken ) ){
IPrincipal principal = new GenericPrincipal( new GenericIdentity( myAccessToken ), new string[] { "myRole" } );
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
return true;
}
这工作正常,然后我可以使用访问令牌在方法中进行第二次查找。但是由于我已经在身份验证时进行了查找,所以我不想浪费另一个 DB 调用。
[我想做的(但显然行不通)]
MyUser user = myDBContext.MyUsers.FirstOrDefault( x => x.TheAccessToken == clientProvidedToken );
if( user != null ){
// Set *SOME* property to the User object, such that it can be
// access in the body of my controller method
// (e.g. /api/profile uses this object to load data)
HttpContext.Current.User = user;
return true;
}