繁体   English   中英

自定义授权属性 ASP.NET WebApi - Null 角色

[英]Custom Authorization Atribute ASP.NET WebApi - Null Roles

我正在尝试实现自定义授权,但无法通过该属性获取角色。 如果我运行我的代码,它会达到 BasicAuth class 但我无法通过任何角色值。 我什至尝试为 class 创建一个新的“AllowedRoles”属性,但这也不起作用。 我究竟做错了什么? 如何通过自定义属性传递值?

   public class BasicAuthAttribute : AuthorizeAttribute 
    {
        private const string Realm = "my.api.com";

        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var r = Roles; // NULL?


            //more code that's not relevant

        }

   public class ValuesController : ApiController
    {
        // GET api/<controller>
        [BasicAuth(Roles = "admin")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }

   public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

    }

   public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // Basic Auth Attribute
            config.Filters.Add(new BasicAuthAttribute());
        }
    }



我有一个类似的问题,我发现,第一次调用一个动作时,该动作的授权过滤器的属性集被调用,并使用属性类型的默认值(例如 null 为字符串)。

就我而言,我使用自定义 RolesArray 属性“包装”角色,类似于:

public string[] RolesArray { get => Roles is null ? new string[0] : Roles.Split(','); set => Roles = string.Join(",", value ?? new string[0]); }

而且我总是得到 string[0] 因为有一个意外的调用来设置 null 作为值。

在我的情况下,解决方案是防止在值为 null 时设置角色,因此:

set { if (value is not null) Roles = ... }

在您的情况下,解决方案更复杂。 角色是不可覆盖的。 此外,它设置了一个私有支持字段,然后在 IsAuthorized 中使用根据您想要覆盖默认实现的程度,您可以尝试使用公共新字符串角色来隐藏它...然后覆盖 IsAuthorized,或者您可以完全重新- 通过从 AuthorizationFilterAttribute 派生来实现属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM