小编jun*_*gos的帖子

分层数据方案中的实体级访问控制

坦率地说,我对实体级授权有一个要求。我希望得到一些关于这个权限结构的指导,我如何在 .NET 4.5 中实现它,以及是否有办法改进它。

它是这样的:


我有一组结构如下的数据:

在此处输入图片说明

在哪里

  • aFleet是零个或多个的集合Cars
  • aFleet可以包含其他Fleets

舰队可以在以后重组和移动以用于组织目的。

我在系统中有多个具有与这些实体相关的权限的角色:

  • 车主:可以在车队中添加或移除汽车
  • 经理:为汽车分配司机
  • 司机:允许简单地驾驶汽车
  • 机械师:可以修理汽车

授权逻辑允许User系统中的 a 被授予对具有一个或多个角色的aFleet或 a 的访问权限Car

以下是一些有助于解释的场景:

  1. 如果我授予User Jim以角色访问Fleet #5 的权限Driver,他将被允许驾驶车队 #2 下的任何汽车。由此产生的权限允许他驾驶汽车 #4, 5, 6
  2. 如果我授予用户MauraCar #1作为机械师的访问权限,则由此产生的权限允许她只修理汽车 #1。
  3. 如果我授予用户Sarah访问 Fleet #2 的角色Owner和权限Mechanic,她可以添加和移除车队 #2, 4, 5并且她可以修理汽车 #1, 2, 3, 4, 5, 6 …

access-control claims-based-identity role-based role-base-authorization role-based-access-control

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

捕获失败的授权策略

在 .Net Core 2 中,假设有一个授权策略来检查用户是否存在特定声明:

public class CompletedProfileRequirement : AuthorizationHandler<CompletedProfileRequirement>, IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CompletedProfileRequirement requirement)
    {
        // Check that all required claims exist
        if (/* invalid user claims */) {
            context.Fail();
        }

        context.Succeed(requirement);
        return Task.FromResult(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们将策略检查放在 MVC 控制器之上:

[Authorize(Policy = "CompletedProfile")]
public class HomeController : Controller
{
     // Controller stuff
}
Run Code Online (Sandbox Code Playgroud)

我如何编写一个IAuthorizationFilter以便我们可以捕获此特定CompletedProfileRequirement策略的失败,以便我们可以将用户重定向到他们可以完成其个人资料的页面?

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

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

DataAnnotation和可选的DateTime值

我正在使用一个接受4个日期的HTML表单,其中两个是可选的.这些日期被插入到MS SQL数据库中,所以我边界检查从表单传递的DateTime变量,对SqlDateTime.MinValueSqlDateTime.MaxValue.这是我的模型的样子:

        [Required]
        [DisplayName("Planned Start Date")]
        [CustomValidation(typeof(Goal), "ValidateGoalDate")]
        public object planned_start_date { get; set; }

        [DisplayName("Actual Start Date")]
        [CustomValidation(typeof(Goal), "ValidateGoalDate")]
        public object start_date { get; set; }

        [Required]
        [DisplayName("Planned End Date")]
        [CustomValidation(typeof(Goal), "ValidateGoalDate")]
        public object planned_end_date { get; set; }

        [DisplayName("Actual Start Date")]
        //[CustomValidation(typeof(Goal), "ValidateGoalDate")]
        public object end_date { get; set; }
Run Code Online (Sandbox Code Playgroud)

我的自定义验证器:

    public static ValidationResult ValidateGoalDate(DateTime goalDate) {

        //* this does not appear to work ever because the optional field does
        //*   not ever get …
Run Code Online (Sandbox Code Playgroud)

c# asp.net data-annotations asp.net-mvc-3

4
推荐指数
1
解决办法
3558
查看次数

.Net Core 2 OpenID Connect身份验证和多个身份

我仍在学习Identity Framework,并且在尝试在.Net Core 2 MVC应用程序中设置身份验证时非常迷失。感谢我提供任何建议,因为我什至不确定自己在做什么。


我需要集成OpenID Connect身份提供程序进行身份验证,并使用辅助数据源进行授权。除名称声明外,我不方便使用OIDC IdP的任何声明。其余的用户声明必须来自辅助数据源(该辅助数据源通过定制UserStoreUser实体连接到Identity Framework )。

我正在使用OpenId Connect提供程序来处理身份验证。这工作正常,并为我提供了第一个身份(我只能使用一个索赔)。当我需要获取用户的第二个Identity并将其添加到主体,并将其设置为default时,我的困惑就开始了Identity。该秒Identity提供了所有用户声明,包括角色。

我对身份框架的理解是,我应该拥有一个ClaimsPrincipal带有两个身份的单一身份,以便可以插入身份框架的其余部分。但是,对于两个身份,默认值ClaimsPrincipal将自动选择第一个身份(这是我不能使用的身份),因此,似乎我应该创建一个自定义ClaimsPrincipal并将其设置为PrimaryIdentitySelector第二个身份为主要身份。

public class MyClaimsPrincipal : ClaimsPrincipal
{
    private static readonly Func<IEnumerable<ClaimsIdentity>, ClaimsIdentity> IdentitySelector = SelectPrimaryIdentity;

    /// <summary>
    /// This method iterates through the collection of ClaimsIdentities and chooses an identity as the primary.
    /// </summary>
    private static ClaimsIdentity SelectPrimaryIdentity(IEnumerable<ClaimsIdentity> identities)
    {
        // Find and return the …
Run Code Online (Sandbox Code Playgroud)

c# openid-connect asp.net-core asp.net-core-2.0

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