我知道这取决于项目,但我想学习典型的asp.net核心项目是否存在常见做法(例如忽略node_modules).
我正在尝试使用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部分: …
我正在尝试开发一个类库,我想在其中实现自定义DbContext.在SaveChanges方法中DbContext,我需要获取当前用户的信息(部门,用户名等)以供审计.DbContext代码的某些部分如下:
public override int SaveChanges()
{
// find all changed entities which is ICreateAuditedEntity
var addedAuditedEntities = ChangeTracker.Entries<ICreateAuditedEntity>()
.Where(p => p.State == EntityState.Added)
.Select(p => p.Entity);
var now = DateTime.Now;
foreach (var added in addedAuditedEntities)
{
added.CreatedAt = now;
added.CreatedBy = ?;
added.CreatedByDepartment = ?
}
return base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
想到两个选项:
HttpContext.Items保存用户信息,注入IHttpContextAccessor并从中获取信息
HttpContext.Items(在这种情况下DbContext取决于HttpContext,是否正确?)HttpContext.Items从对象获取信息(我读了一些ThreadStatic不安全的帖子)问题:哪种情况最适合我的情况?你有其他建议吗?
我有一个通用的动作过滤器,我想在OnActionExecuting方法中获得当前的模型.我目前的实现如下:
public class CommandFilter<T> : IActionFilter where T : class, new()
{
public void OnActionExecuting(ActionExecutingContext actionContext)
{
var model= (T)actionContext.ActionArguments["model"];
}
}
Run Code Online (Sandbox Code Playgroud)
如果我的所有型号名称相同,它的效果很好.但我想使用不同的模型名称.
如何解决这个问题呢?
编辑
public class HomeController : Controller
{
[ServiceFilter(typeof(CommandActionFilter<CreateInput>))]
public IActionResult Create([FromBody]CreateInput model)
{
return new OkResult();
}
}
Run Code Online (Sandbox Code Playgroud) 哪种方式更好的携带请求数据(两种方式之间有什么区别)?
例如:
选项1(Scoped Service):
//Scoped Service(this may be interface)
public class SampleScopedService
{
public string Data { get; set; }
}
//Register service
services.AddScoped<SampleScopedService>();
//Set and Get Data
public class SampleUsage
{
private readonly SampleScopedService _sampleScopedService;
public SampleUsage(SampleScopedService sampleScopedService)
{
_sampleScopedService = sampleScopedService;
// _sampleScopedService.Data = "Sample";
// _sampleScopedService.Data
}
}
Run Code Online (Sandbox Code Playgroud)
选项2(HttpContext.Items)
//Scoped Service
public class SampleScopedService
{
private readonly IHttpContextAccessor _accessor;
public SampleScopedService(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public string GetData()
{
return (string)_accessor.HttpContext.Items["Data"]; …Run Code Online (Sandbox Code Playgroud) 我的主要目标是使用 Windows 身份验证来查询我的自定义用户表以通过 Web 应用程序使用。我不确定是否有传统的方法来做到这一点。
我在 SQL 数据库中有一个预定义的用户表和角色表。如何使用User.Identity.Name查询此用户表并将所有表数据以及角色映射到ApplicationUser稍后可以在 Intranet Web 应用程序中进一步使用的类?
通过阅读大量文章,我无法找到与我所追求的内容密切相关的任何内容。我认为这将在Startup课堂上完成,ConfigureServices但我也不确定。我需要在用户第一次导航到该站点时对其进行查找。
我想知道如何正确处理 cookie 过期的事实?是否可以执行自定义操作?
我想实现的是,当 cookie 过期时,在通过此信息重定向到动作参数时,从当前 cookie 中取出少量信息。是否可以 ?
我正在使用ASP.NET 5制作网站重新架构的原型,我正在讨论使用IdentityServer4进行身份验证和授权.我已经回顾了很多关于设置IdentityServer3和4的示例和文章,如果它能够以正确的方式处理我的客户端的要求,我试图解决这个问题.这是我的要求.
我有3个需要授权的网站.站点1(abc.com)将需要Windows身份验证,并且将使用角色(或转换为声明的角色)进行授权的mvc和webapi调用的组合.站点2(def.com)是一个受信任的站点,它希望在其站点上具有用户名/密码/ rememberme文本框的登录窗口小部件,在提交时将对用户进行身份验证并将其重定向到站点3(xyz.com).站点3也将有自己的登录页面,并将使用声明的mvc和webapi调用的组合.站点2和3将不使用Windows身份验证,并且客户端不希望它们重定向到身份服务器登录屏幕,而是拥有自己的登录屏幕并从具有登录凭据的代码调用身份服务器.
以下是有关此方案和IdentityServer4的问题.
可以设置idsvr4以使客户端收集用户名/密码/ rememberme值并通过代码传递它们以获得mvc和webapi的正确jwt令牌吗?
如果是这样,它可以将它们记录到另一个站点上的mvc和webapi应用程序中吗?
如果是这样,这是否规避了identityserver4的真正目的,因此这是一个坏主意?
如果它可以处理这种情况并且是一个好主意,我如何设置客户端,范围和代码来处理通过代码和重定向登录?
示例非常好,非常受欢迎,但我甚至不确定用什么词汇来搜索这个场景,所以即使指向正确的方向也会有很大的帮助.
windows-authentication asp.net-web-api2 asp.net-core-mvc asp.net-core identityserver4
我在 asp 中创建了我的自定义身份验证中间件。net core 项目,并注册如下:
public class MyAuthenticationMidleware
{
private readonly RequestDelegate _next;
public ConnectAuthenticationMidleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (!UserIsAuthenticated())
{
context.Response.StatusCode = 401;
return;
}
...
await _next.Invoke(context);
}
}
public static class MyAuthenticationMidlewareExtensions
{
public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyAuthenticationMidleware>();
}
}
Run Code Online (Sandbox Code Playgroud)
在启动中:
public void Configure(...)
{
app.UseStaticFiles();
app.UseMyAuthentication();
app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)
这可以正常工作 - 为每个请求运行身份验证中间件。如果用户未通过身份验证,则返回 401。否则将调用特定的 mvc 操作。
我试图做的是阻止身份验证中间件针对某些特定操作运行。我使用MapWhenmethod 创建了另一个扩展方法,并按如下方式使用它:
public static class MyAuthenticationMidlewareExtensions
{ …Run Code Online (Sandbox Code Playgroud) 我打算编写一个ActionFilterfor business验证,其中一些服务将通过Service Locator解决(我知道这不是一个好的做法,我尽可能避免使用Service Locator模式,但对于这种情况我想使用它).
OnActionExecuting 过滤器的方法是这样的:
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
// get validator for input;
var validator = actionContext.HttpContext.RequestServices.GetService<IValidator<TypeOfInput>>();// i will ask another question for this line
if(!validator.IsValid(input))
{
//send errors
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能为上面写单元测试ActionFilter以及如何?
我有用文件Application_BeginRequest方法编写的业务登录Global.asax,我从数据库中获取html内容,并使用文字控件在视图中设置内容.
现在我将项目迁移到.net核心,我想要像上面提到的那样做.我在代码中使用了html内容,middleware但现在我试图在视图中显示内容但无法这样做.
以下是我的模特
@model string
<div id="content">@Model</div>
Run Code Online (Sandbox Code Playgroud)
我正在回来
return View(html);
Run Code Online (Sandbox Code Playgroud)
作为一个字符串.
我的问题是,我想知道如何使用.net核心显示来自数据库的html内容的步骤.
我正在google以获取ASP.NET Identity 3.0中的控制器中的应用程序用户,但我只找到5及更低的结果.
我试图获得ApplicationUser属性,但我无法得到它ApplicationUser.我想这很容易,因为我是唯一有这个问题的人.
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Data.Entity;
using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.AspNet.Identity;
using System.Security.Claims;
namespace ApplicationUserFMLTest.Controllers
{
public class CustomClassController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private ApplicationDbContext _context;
public CandidatesController(ApplicationDbContext context, UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_context = context;
_userManager = userManager;
_signInManager = signInManager;
}
// GET: CustomClass
public async Task<IActionResult> Index()
{
ApplicationUser currentUser = _userManager.FindByIdAsync(User.Identity.GetUserId()).Result;
if (currentUser.PropBool) …Run Code Online (Sandbox Code Playgroud) ASP.NET Core引入了自定义标记帮助器,可以在如下视图中使用:
<country-select value="CountryCode" />
Run Code Online (Sandbox Code Playgroud)
但是,我不明白如何在类中获取模型属性名称:
public class CountrySelectTagHelper : TagHelper
{
[HtmlAttributeName("value")]
public string Value { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
...
// Should return property name, which is "CountryCode" in the above example
var propertyName = ???();
base.Process(context, output);
}
}
Run Code Online (Sandbox Code Playgroud)
在以前的版本中,我可以使用ModelMetadata以下命令执行此操作:
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var property = metadata.PropertyName; // return "CountryCode"
Run Code Online (Sandbox Code Playgroud)
如何在新的ASP.NET标签助手中执行相同操作?
asp.net-core ×13
c# ×6
asp.net-mvc ×3
.net-core ×1
git ×1
identity ×1
razor ×1
tag-helpers ×1
unit-testing ×1