C# ApiController重写以访问用户。声明
我有一个从ApiController继承的基础api控制器。在其中,我覆盖了ExecuteAsync,并希望使用Principal.Claimes变量中存储的一些数据,但在调用base.ExecuteAsync()之前它是空的,调用之后就太迟了。我看不到任何其他可以替代的东西来帮助这个C# ApiController重写以访问用户。声明,c#,model-view-controller,asp.net-web-api,asp.net-identity,owin,C#,Model View Controller,Asp.net Web Api,Asp.net Identity,Owin,我有一个从ApiController继承的基础api控制器。在其中,我覆盖了ExecuteAsync,并希望使用Principal.Claimes变量中存储的一些数据,但在调用base.ExecuteAsync()之前它是空的,调用之后就太迟了。我看不到任何其他可以替代的东西来帮助这个 public class ApiControllerBase : ApiController { public MyUser CurrentUser { get; set; } public o
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;
}
}
公共类ApiController数据库:ApiController
{
公共MyUser当前用户{get;set;}
公共覆盖任务ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)
{
//principal.claims是空的
ClaimsPrincipal principal=(ClaimsPrincipal)RequestContext.principal;//principal.claims为空
var rv=base.ExecuteAsync(controllerContext,cancellationToken);
//principal.claims现在已填充,但继承自此basecontroller的controller.action已激发并引发异常,因为CurrentUser为null。
principal=(ClaimsPrincipal)RequestContext.principal;
}
}
您可以重写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);
}
您可以重写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);
}
如果需要访问控制器中的声明,可以执行以下操作:
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); }
}
}
}
公共类MyUser
{
私有只读请求实体标识;
公共用户(索赔实体身份)
{
_身份=身份;
}
公共IEnumerable声明{get{return}identity.Claims;}
}
公共抽象类BaseController:ApiController
{
私有MyUser\u用户;
公共新MyUser用户
{
得到
{
返回_user???(_user=user.Identity!=null
?新MyUser((ClaimsIdentity)User.Identity)
:null);}
}
}
}
然后在任何需要的地方使用用户属性
假设请求进入ApicController范围,操作顺序如下:
- 调用ApicController的ExecuteAsync方法
- 调用ApiController的Initialize方法
- 将检索已注册的操作选择器
- 调用已注册操作选择器的SelectAction方法。 如果只匹配一个操作方法,则管道将继续
- 将检索所选操作的所有已注册筛选器
- 授权过滤器被称为。授权过滤器可以
决定让管道继续执行或 终止管道 - 如果授权筛选器未终止请求,请执行操作 将执行参数绑定
- 已设置ApiController.ModelState
- 调用操作筛选器。该操作筛选一个“决定”选项 让管道继续执行或终止管道
- 如果操作筛选器未终止请求,则注册操作 调用程序被检索
- 已注册操作调用程序的InvokeActionAsync方法为 调用以调用所选操作方法
在这两者之间还发生了一些事情,但这非常接近于一个完整的视图。查看以了解更多信息。如果您需要访问控制器中的索赔,可以执行以下操作:
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); }
}
}
}
公共类MyUser
{
私有只读请求实体标识;
公共用户(索赔实体身份)
{
_身份=身份;
}
公共IEnumerable声明{get{return}identity.Claims;}
}
公共抽象类BaseController:ApiController
{
私有MyUser\u用户;
公共新MyUser用户
{
得到
{
返回_user???(_user=user.Identity!=null
?新MyUser((ClaimsIdentity)User.Identity)
:null);}
}
}
}
然后在任何需要的地方使用用户属性
假设请求进入ApicController范围,操作顺序如下:
- 调用ApicController的ExecuteAsync方法
- 调用ApiController的Initialize方法
- 将检索已注册的操作选择器
- 调用已注册操作选择器的SelectAction方法。 如果只匹配一个操作方法,则管道将继续
- 将检索所选操作的所有已注册筛选器
- 授权过滤器被称为。授权过滤器可以
决定让管道继续执行或 终止管道 - 如果授权筛选器未终止请求,请执行操作 将执行参数绑定
- 已设置ApiController.ModelState
- 调用操作筛选器。该操作筛选一个“决定”选项 让管道继续执行或终止管道
- 如果操作筛选器未终止请求,则注册操作 调用程序被检索
- 已注册操作调用程序的InvokeActionAsync方法为 调用以调用所选操作方法
public override Task ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)
{
var principal=Thread.CurrentPrincipal作为ClaimsPrincipal;
返回base.ExecuteAsync(controllerContext,cancellationToken);
}
我不确定IAppBuilde中的注册顺序是否正确