小编ade*_*lin的帖子

gitignore对aspnet核心项目的常见做法是什么?

我知道这取决于项目,但我想学习典型的asp.net核心项目是否存在常见做法(例如忽略node_modules).

git asp.net-core

52
推荐指数
4
解决办法
3万
查看次数

如何使用Asp.Net Core实现基于权限的访问控制

我正在尝试使用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部分: …

c# asp.net-mvc access-control asp.net-core

38
推荐指数
1
解决办法
3万
查看次数

如何使用Net Core在DbContext中获取用户信息

我正在尝试开发一个类库,我想在其中实现自定义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,是否正确?)
  • 使用ThreadStatic对象而不是HttpContext.Items从对象获取信息(我读了一些ThreadStatic不安全的帖子)

问题:哪种情况最适合我的情况?你有其他建议吗?

c# entity-framework-core .net-core asp.net-core

17
推荐指数
2
解决办法
9193
查看次数

如何在动作过滤器中获取当前模型

我有一个通用的动作过滤器,我想在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)

c# asp.net-core-mvc asp.net-core

14
推荐指数
2
解决办法
1万
查看次数

HttpContext.Items vs Scoped Service

哪种方式更好的携带请求数据(两种方式之间有什么区别)?

例如:

选项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)

asp.net-core

8
推荐指数
1
解决办法
1448
查看次数

如何对数据库中的用户使用 Windows 身份验证

我的主要目标是使用 Windows 身份验证来查询我的自定义用户表以通过 Web 应用程序使用。我不确定是否有传统的方法来做到这一点。

我在 SQL 数据库中有一个预定义的用户表和角色表。如何使用User.Identity.Name查询此用户表并将所有表数据以及角色映射到ApplicationUser稍后可以在 Intranet Web 应用程序中进一步使用的类?

通过阅读大量文章,我无法找到与我所追求的内容密切相关的任何内容。我认为这将在Startup课堂上完成,ConfigureServices但我也不确定。我需要在用户第一次导航到该站点时对其进行查找。

c# asp.net-core-mvc asp.net-core

7
推荐指数
1
解决办法
2261
查看次数

如何在asp.net core中处理cookie过期

我想知道如何正确处理 cookie 过期的事实?是否可以执行自定义操作?

我想实现的是,当 cookie 过期时,在通过此信息重定向到动作参数时,从当前 cookie 中取出少量信息。是否可以 ?

asp.net-mvc asp.net-identity asp.net-core-mvc asp.net-core

6
推荐指数
2
解决办法
1万
查看次数

asp.net 5和IdentityServer4

我正在使用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的问题.

  1. Idsvr4可以使用Windows身份验证处理一个客户端而另一个使用用户名/密码身份验证吗?
    • 如果是这样,是否有理由在idsvr4中使用Windows auth或者它是否只是在webapp中使用标准的Windows auth?
  2. 可以设置idsvr4以使客户端收集用户名/密码/ rememberme值并通过代码传递它们以获得mvc和webapi的正确jwt令牌吗?

    • 如果是这样,它可以将它们记录到另一个站点上的mvc和webapi应用程序中吗?

    • 如果是这样,这是否规避了identityserver4的真正目的,因此这是一个坏主意?

  3. 如果它可以处理这种情况并且是一个好主意,我如何设置客户端,范围和代码来处理通过代码和重定向登录?

示例非常好,非常受欢迎,但我甚至不确定用什么词汇来搜索这个场景,所以即使指向正确的方向也会有很大的帮助.

windows-authentication asp.net-web-api2 asp.net-core-mvc asp.net-core identityserver4

5
推荐指数
1
解决办法
824
查看次数

有条件地使用自定义中间件

我在 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)

asp.net-core-mvc asp.net-core

4
推荐指数
2
解决办法
3113
查看次数

使用Service Locator时如何为ActionFilter编写单元测试

我打算编写一个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以及如何?

unit-testing asp.net-core-mvc asp.net-core asp.net-core-1.0

3
推荐指数
2
解决办法
3907
查看次数

使用.net核心,如何在视图中显示来自数据库的html内容

我有用文件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内容的步骤.

c# asp.net-core-mvc asp.net-core

3
推荐指数
1
解决办法
4919
查看次数

将ApplicationUser放入控制器中

我正在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)

c# identity entity-framework-core asp.net-core

3
推荐指数
1
解决办法
1425
查看次数

在标签助手中获取属性名称

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-mvc razor tag-helpers asp.net-core

2
推荐指数
1
解决办法
1414
查看次数