坦率地说,我对实体级授权有一个要求。我希望得到一些关于这个权限结构的指导,我如何在 .NET 4.5 中实现它,以及是否有办法改进它。
它是这样的:
我有一组结构如下的数据:
在哪里
Fleet是零个或多个的集合Cars。Fleet可以包含其他Fleets 舰队可以在以后重组和移动以用于组织目的。
我在系统中有多个具有与这些实体相关的权限的角色:
授权逻辑允许User系统中的 a 被授予对具有一个或多个角色的aFleet或 a 的访问权限Car。
以下是一些有助于解释的场景:
User Jim以角色访问Fleet #5 的权限Driver,他将被允许驾驶车队 #2 下的任何汽车。由此产生的权限允许他驾驶汽车 #4, 5, 6Car #1作为机械师的访问权限,则由此产生的权限允许她只修理汽车 #1。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
在 .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策略的失败,以便我们可以将用户重定向到他们可以完成其个人资料的页面?
我正在使用一个接受4个日期的HTML表单,其中两个是可选的.这些日期被插入到MS SQL数据库中,所以我边界检查从表单传递的DateTime变量,对SqlDateTime.MinValue和SqlDateTime.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) 我仍在学习Identity Framework,并且在尝试在.Net Core 2 MVC应用程序中设置身份验证时非常迷失。感谢我提供任何建议,因为我什至不确定自己在做什么。
我需要集成OpenID Connect身份提供程序进行身份验证,并使用辅助数据源进行授权。除名称声明外,我不方便使用OIDC IdP的任何声明。其余的用户声明必须来自辅助数据源(该辅助数据源通过定制UserStore和User实体连接到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)