随着Core 1.1遵循@ blowdart的建议并实施了自定义中间件:
它的工作方式如下:
这有点适用于2.0,除了如果令牌无效(上面的步骤2)并且从未添加声明我得到"没有指定authenticationScheme,并且没有找到DefaultChallengeScheme."
所以现在我正在读取2.0中的auth更改:
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
在ASP.NET Core 2.0中我做同样的事情的正确途径是什么?我没有看到做真正的自定义身份验证的示例.
我有一个用AuthorizeAttribute修饰的控制器.除了一个需要CustomAuthorizeAttribute提供的自定义身份验证的操作外,控制器还包含几个需要身份验证的操作.
我的问题是,一旦我在控制器级别添加[授权],我可以使用[CustomAuthorize]仅在一个操作上覆盖它(或删除它)吗?或者我是否必须从控制器级别删除[授权]并将其单独添加到其他每个操作?
我纯粹是为了方便,因为我很懒,不想用AuthorizeAttribute来装饰每一个动作.
[Authorize]
public class MyController : Controller {
//requires authentication
public ViewResult Admin() {
return View();
}
//... a lot more actions requiring authentication
//requires custom authentication
[CustomAuthorize] //never invoked as already failed at controller level
public ViewResult Home() {
return View();
}
}
Run Code Online (Sandbox Code Playgroud) 我试图将一个服务注入我的动作过滤器,但我没有在构造函数中注入所需的服务.这是我有的:
public class EnsureUserLoggedIn : ActionFilterAttribute
{
private readonly ISessionService _sessionService;
public EnsureUserLoggedIn()
{
// I was unable able to remove the default ctor
// because of compilation error while using the
// attribute in my controller
}
public EnsureUserLoggedIn(ISessionService sessionService)
{
_sessionService = sessionService;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
// Problem: _sessionService is null here
if (_sessionService.LoggedInUser == null)
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Result = new JsonResult("Unauthorized");
}
}
}
Run Code Online (Sandbox Code Playgroud)
而我正在装饰我的控制器:
[Route("api/issues"), EnsureUserLoggedIn]
public class IssueController : …Run Code Online (Sandbox Code Playgroud) 题
如何在ASP.NET Core Web应用程序中实现具有自定义成员身份的基本身份验证?
笔记
basic-authentication asp.net-core-mvc asp.net-core asp.net-core-1.0
我正在尝试使用aspnet核心实现基于权限的访问控制.为了动态管理用户角色和权限(create_product,delete_product等),它们存储在数据库中.数据模型类似于http://i.stack.imgur.com/CHMPE.png
在aspnet核心之前(在MVC 5中)我使用AuthorizeAttribute下面的自定义来处理这个问题:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
private readonly string _permissionName { get; set; }
[Inject]
public IAccessControlService _accessControlService { get; set; }
public CustomAuthorizeAttribute(string permissionName = "")
{
_permissionName = permissionName;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var user = _accessControlService.GetUser();
if (PermissionName != "" && !user.HasPermission(_permissionName))
{
// set error result
filterContext.HttpContext.Response.StatusCode = 403;
return;
}
filterContext.HttpContext.Items["CUSTOM_USER"] = user;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在下面的动作方法中使用它:
[HttpGet]
[CustomAuthorize(PermissionEnum.PERSON_LIST)]
public ActionResult Index(PersonListQuery query){ }
Run Code Online (Sandbox Code Playgroud)
另外,我在视图中使用HttpContext.Items ["CUSTOM_USER"]来显示或隐藏html部分: …
我在类方法上指定两个单独的Authorization属性时遇到问题:如果两个属性中的任何一个为true,则允许用户访问.
Athorization类看起来像这样:
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class AuthAttribute : AuthorizeAttribute {
. . .
Run Code Online (Sandbox Code Playgroud)
和行动:
[Auth(Roles = AuthRole.SuperAdministrator)]
[Auth(Roles = AuthRole.Administrator, Module = ModuleID.SomeModule)]
public ActionResult Index() {
return View(GetIndexViewModel());
}
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,还是我需要重新考虑我的方法?
这将在MVC2中运行.
我有很多控制器有很多动作.每个操作都有自己的角色(角色名称= ControllerName.actionName).
在以前的版本中,我可以测试当前用户是否可以使用"通用"AuthorizeAttribute访问操作:
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
string currentAction = actionContext.ActionDescriptor.ActionName;
string currentController = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
Roles = (currentController + "." + currentAction).ToLower();
base.OnAuthorization(actionContext);
}
Run Code Online (Sandbox Code Playgroud)
使用asp.net 5版本,我发现我需要使用需求(如何在ASP.NET Core中创建自定义AuthorizeAttribute?).问题是AuthorizationContext没有向我们提供有关用户尝试访问的操作的信息.
我不想在每个操作上放置Authorize属性,有没有办法用新框架实现我的要求?(我更喜欢避免使用HttpContext.Current,它不适合管道架构)
使用ASP.Net WebAPI时,我曾经使用过自定义Authorize属性来返回HTTP 403或401根据情况.例如,如果用户未经过身份验证,则返回401; 如果用户已通过身份验证但没有相应的权限,请返回a 403.有关详细信息,请参阅此处.
现在看来,在新的ASP.Net Core中,他们不希望你再次覆盖该Authorize属性,而是倾向于采用基于策略的方法.然而,似乎Core MVC遭受了401与其前辈相同的"只返回所有auth错误"的方法.
如何覆盖框架以获得我想要的行为?
我正在开发一个用户可以通过用户名和密码进行身份验证的应用程序,我们提供了一个JWT令牌,然后在服务器上进行验证.
我想补充的一件事是能够拥有一个特殊的API密钥(guid),用户可以在与此应用程序集成时使用,而不是使用用户名和密码.
我不确定如何做到这一点,因为身份验证部分似乎是一个黑盒子(使用Aspnet身份).
以下是我的一些身份验证设置代码
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<OmbiContext>(options =>
options.UseSqlite("Data Source=Ombi.db"));
services.AddIdentity<OmbiUser, IdentityRole>()
.AddEntityFrameworkStores<OmbiContext>()
.AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 1;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IMemoryCache cache)
{
var tokenOptions = (IOptions<TokenAuthentication>)app.ApplicationServices.GetService(
typeof(IOptions<TokenAuthentication>));
var ctx = (IOmbiContext)app.ApplicationServices.GetService(typeof(IOmbiContext));
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.Value.SecretKey)),
RequireExpirationTime = true,
ValidateLifetime = …Run Code Online (Sandbox Code Playgroud) Net Core策略授权,但对我来说它看起来非常静态.因为在企业应用程序中,经常需要新的角色,这些角色需要新的策略(据我所知)或者您想要实现特定于某个客户端的新类型的策略.例如,如果我们正在构建一个由这些策略驱动的CMS,我们将希望每个客户端能够定义他自己的策略.那么这个新的政策基础机制能否更具活力,或者它的想法完全不同?
谢谢 :))