我只想向用户授权我的行为
[授权(用户=“anupam,ashwin”)]public ActionResult AddArticle(){ return View();}参考这里
但我只发现角色……
您引用的文章是ASP.NET MVC,而不是ASP.NET Core。一般来说,你应该忽略那里的任何东西,因为它不再适用。
似乎ASP.NET Core删除了对指定的支持 Users 在 AuthorizeAttribute (但是,坦率地说,我并不知道ASP.NET MVC首先拥有它)。但是,可以通过策略模仿此功能:
Users
AuthorizeAttribute
services.AddPolicy("MustBeJoeOrBob", p => p.RequireAssertion(c => new[] { "Joe", "Bob" }.Contains(c.User.Identity.Name)));
然后:
[Authorize(Policy = "MustBeJoeOrBob")]
但是,如果不清楚,这需要相当多的硬编码,并且您需要为每个不同的用户组制定单独的策略。例如,如果Joe和Mary只能访问其他操作,但是 不 鲍勃,那么你也需要添加一个“MustBeJoeOrMary”政策。这可能会很快变得乏味。
从技术上讲,有一种方法可以让一个策略处理任何给定的用户列表,但实现并非易事。你基本上必须创建自定义 AuthorizeAttribute ,然后允许您传递不同类型的数据。但是,实际授权仍然需要基于策略,因此您基本上只是将传入的值映射到具有标准前缀的自定义策略名称。例如:
public class UsersAuthorizeAttribute : AuthorizeAttribute { private const string PolicyPrefix = "MustBeUsers" public UsersAuthorizeAttribute(string users) { Users = users; } public string Users { get => Policy.Substring(PolicyPrefix.Length); set => $"{PolicyPrefix}{value}"; } }
然后,您可以应用以下属性:
[UsersAuthorize("Joe,Bob")]
这有效地做了同样的事情:
[Authorize(Policy = "MustBeUsersJoe,Bob")]
换句话说,它只是创建“动态”策略名称的简便方法。但是,您现在需要一个策略处理程序,因此您可以回到为每个可能的用户组合创建一个策略处理程序,或者您必须创建自定义策略提供程序。然后,该策略提供者可以只查看前缀“MustBeUsers”,并使用类似的东西 MustBeUsersAuthorizationHandler 为了满足策略,将其余的策略名称(即实际的用户名)传递给处理程序,以便对其进行评估。但是,ASP.NET Core只使用一个策略提供程序,因此一旦您进入自定义策略提供程序,您还需要确保它还支持其他策略,或者至少在内部将策略处理委派给默认提供程序。 文档更详细 ,但足以说,你可以开始快速进入杂草。
MustBeUsersAuthorizationHandler
老实说,这整个方法感觉就像一个巨大的黑客,我真的很惊讶,文档实际上描述了如何实现它的细节。如果你 真 需要这样的东西,它可能有意义,但在你的场景中,我认为你错过了一个至关重要的事情:你可以只使用角色。
如果您只希望Joe和Bob能够访问特定操作,那么只需创建一个角色并将其分配给该角色即可。然后指定该角色:
[Authorize(Roles = "JoeAndBobsRole")]
这就是角色的用途,您实际上是试图以不同的方式支持并实现相同的功能。说实话,这可能就是原因 Users 在ASP.NET Core中首先不作为选项存在。