【问题标题】:Get Controller instance in AuthorizeAttribute Mvc Core Web Api在 AuthorizeAttribute Mvc Core Web Api 中获取控制器实例
【发布时间】:2018-06-10 02:09:45
【问题描述】:

我使用下面的类来控制我的 api 方法请求并设置 BaseController 类的一些属性以在方法中常用。 这个来自 Asp.Net Mvc Web Api

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class AuthUserAttribute : AuthorizeAttribute
{

    private string Action { get; set; }

    public AuthUserAttribute(string action)
    {
        this.Action = action;
    }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        BaseController baseController = httpContext.ControllerContext.Controller as BaseController;
        baseController.someCommenProperty = someValue;
    }
}

但是当我试图在 Asp.Net Mvc Core Api 中实现相同的结构时 我无法到达已初始化的控制器实例。 有什么办法可以得到那个实例。

使用 Microsoft.AspNetCore.Authorization;

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Primitives;
using System;
using System.Linq;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class AuthUserAttribute : AuthorizeAttribute, IAuthorizationFilter
{


    private string Action { get; set; }
    public AuthUserAttribute(string action)
    {
        this.Action = action;
    }



    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // how to get controller instance from context
    }
}

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc controllercontext


    【解决方案1】:

    您可以使用context.ActionDescriptor 获取控制器上的Type 信息。
    控制器 object 在授权检查时可能根本没有实例化。
    您还可以实现IActionFilter 并在其中使用控制器实例

    public void OnActionExecuting(ActionExecutingContext context)
    

    public void OnActionExecuted(ActionExecutingContext context)
    

    【讨论】:

    • 是的,这正是我想要的。但不确定他们为什么改变了 .NetCore 的生命周期。无论如何谢谢:)
    • 在我看来,今天他们更多地考虑全局一致性而不是向后兼容性和遗留代码——它只需要重写:) 无论如何,如果答案有用,或者(也许)它是真正回答,不要犹豫,今天和以后投票或标记:)
    • 我很想但没有足够的声誉:(
    • @d_f 我需要来自控制器实例的信息才能知道授权是否成功。控制器以某种方式配置。您如何建议我在授权期间从控制器中获取信息?我应该创建一个新实例吗?
    • @remcolam 你的问题不够清楚,至少对我来说。正如我在上面回答的那样,在IAuthorizationFilter 工作期间,控制器 可能没有被实例化。当你需要一个 controller 对象时,在一个属性中,它必须是一个IActionFilter。当这两个选项不适合时,因为您需要来自控制器内部的一些信息来做出身份验证决定,那么您的逻辑就会出现一些问题——最好将这些东西移到外面,服务
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2016-07-15
    相关资源
    最近更新 更多