我试图在ASP.NET Core 1.0(MVC 6)Web应用程序中设置授权.
更严格的方法 - 默认情况下,我希望将所有控制器和操作方法限制为具有Admin角色的用户.所以,我正在添加一个全局授权属性,如:
AuthorizationPolicy requireAdminRole = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireRole("Admin")
.Build();
services.AddMvc(options => { options.Filters.Add(new AuthorizeFilter(requireAdminRole));});
Run Code Online (Sandbox Code Playgroud)
然后我想允许具有特定角色的用户访问具体的控制器.例如:
[Authorize(Roles="Admin,UserManager")]
public class UserControler : Controller{}
Run Code Online (Sandbox Code Playgroud)
这当然是行不通的,因为"全局过滤器"不允许UserManager访问控制器,因为它们不是"管理员".
在MVC5中,我能够通过创建自定义授权属性并将我的逻辑放在那里来实现这一点.然后使用此自定义属性作为全局.例如:
public class IsAdminOrAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
if (action.IsDefined(typeof(AuthorizeAttribute), true) ||
action.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true))
{
return;
}
base.OnAuthorization(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图创建一个自定义AuthorizeFilter,但没有成功.API似乎有所不同.
所以我的问题是:是否可以设置默认策略,然后为特定控制器和操作覆盖它.或类似的东西.我不想这样做
[Authorize(Roles="Admin,[OtherRoles]")]
Run Code Online (Sandbox Code Playgroud)
在每个控制器/操作上,因为这是一个潜在的安全问题.如果我不小心忘记了这个Admin角色会发生什么.
我正在尝试在Asp.net核心应用程序(dnx 4.5)中使用cookie身份验证.请注意,因为我有自定义身份验证机制(radius),所以我没有使用核心身份验证提供的开箱即用机制.当用户未经过身份验证时,我想重定向到登录页面.
我在Startup.cs中添加了以下代码.当用户未经过身份验证时,我们的想法是重定向到Login Controller:
app.UseCookieAuthentication(options => { options.LoginPath = new Microsoft.AspNet.Http.PathString("/Login"); });
Run Code Online (Sandbox Code Playgroud)
在我的家庭控制器中,我有:
[Authorize]
public IActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
在我的登录控制器中,我返回一个与radius登录表单对应的视图:
[AllowAnonymous]
public IActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行应用程序时,重定向永远不会发生.查看控制台输出,我看到以下内容:
warn: Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker[0]
Authorization failed for the request at filter 'Microsoft.AspNet.Mvc.Filters.AuthorizeFilter'.
info: Microsoft.AspNet.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler[2]
Executed action ThingsProjectorWeb.Controllers.HomeController.Index in 0ms
info: Microsoft.AspNet.Hosting.Internal.HostingEngine[2]
Request finished in 0.0016ms 401
Run Code Online (Sandbox Code Playgroud)
任何有关如何正确配置这一点的帮助将不胜感激.谢谢!