C# ApiController重写以访问用户。声明

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

我有一个从ApiController继承的基础api控制器。在其中,我覆盖了ExecuteAsync,并希望使用Principal.Claimes变量中存储的一些数据,但在调用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;
    }
}
公共类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方法为 调用以调用所选操作方法
注意:如果从执行授权筛选器到执行操作方法期间发生任何异常,将调用异常筛选器

在这两者之间还发生了一些事情,但这非常接近于一个完整的视图。查看以了解更多信息。

这对我很有用(Thread.CurrentPrincipal)

public override Task ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)
{
var principal=Thread.CurrentPrincipal作为ClaimsPrincipal;
返回base.ExecuteAsync(controllerContext,cancellationToken);
}
我不确定IAppBuilde中的注册顺序是否正确