我有一个从ApiController继承的基本api控制器。在它中,我将覆盖ExecuteAsync,并希望使用存储在Principal.Claims var中的一些数据。但是在调用base.ExecuteAsync()之前它是空的,在调用它之后太晚了。我没看到还有什么能帮上忙的?
public class ApiControllerBase : ApiController
{
public MyUser CurrentUser { get; set; }
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
// principal.claims is empty
ClaimsPrincipal principal = (ClaimsPrincipal)RequestContext.Principal; // principal.claims is empty
var rv = base.ExecuteAsync(controllerContext, cancellationToken);
// principal.claims is now populated but the controller.action that inherits from this basecontroller has already fired and thrown an exception since CurrentUser is null.
principal = (ClaimsPrincipal)RequestContext.Principal;
}
}发布于 2016-04-25 20:14:47
如果需要访问控制器中的索赔,可以执行以下操作:
public class MyUser
{
private readonly ClaimsIdentity _identity;
public SeaUser(ClaimsIdentity identity)
{
_identity= identity;
}
public IEnumerable<Claim> Claims { get { return _identity.Claims; } }
}
public abstract class BaseController : ApiController
{
private MyUser _user;
public new MyUser User
{
get
{
return _user ?? (_user = User.Identity != null
? new MyUser((ClaimsIdentity)User.Identity)
: null); }
}
}
}然后在任何需要的地方使用用户属性。
假设请求进入ApiController范围,操作顺序如下:
注意:如果授权筛选器的执行到操作方法的执行过程中出现任何异常,则调用异常筛选器。
还有一些事情发生在中间,但这是非常接近一个完整的观点。有关更多信息,请查看ApiController源代码。
发布于 2016-04-25 20:09:47
您可以重写OnActionExecuting(),每次执行操作时都会调用它。
public override void OnActionExecuting(ActionExecutingContext context)
{
var user = context.HttpContext.User;
//store user.Claims in property so inherited controllers have access
base.OnActionExecuting(context);
}发布于 2016-04-25 20:20:48
这对我有用(Thread.CurrentPrincipal)
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
var principal = Thread.CurrentPrincipal as ClaimsPrincipal;
return base.ExecuteAsync(controllerContext, cancellationToken);
}我不确定IAppBuilder (Startup.Configuration)中的注册顺序是否重要,但我首先注册的是身份验证中间件。
https://stackoverflow.com/questions/36849692
复制相似问题