[英]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.