【问题标题】:Windows authentication/authorizationWindows 身份验证/授权
【发布时间】:2017-05-28 17:27:38
【问题描述】:

我正在开发一个需要通过服务授权用户的网站。如果我使用 AuthorizeAttribute(将设置 User.Identities),我已经设法让 Windows 身份验证工作。我的计划是创建一个自定义中间件,为用户设置角色/声明,但 context.User 未在中间件中设置。 User.Identities 也不会在我不添加 AuthorizeAttribute 的控制器中设置。

我的目标是编写一个中间件,获取 windows 用户名并使用该用户名调用服务以获取用户有权访问的角色,然后为用户设置角色或声明。

public class RoleMiddleware
{
    private readonly RequestDelegate _next;

    public RoleMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (!rolesSet)
        {
            var result = _service.GetRoles(context.User.Identity.Name);
            //set roles
            //set claims
        }

        await _next.Invoke(context);
    }
}

中间件是否是执行此操作的正确位置,我需要做什么才能以与在控制器中使用 AuthorizeAttribute 时相同的方式访问用户名?

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc .net-core


    【解决方案1】:

    在我看来,这不是正确的做法。 ASP.NET Identity 提供了丰富的类集,您可以覆盖和扩展这些类以满足您的要求。

    如果您想基于某些自定义服务注入角色,那么您应该覆盖 RoleStore(也可能是 RoleManager)并在那里注入您的自定义角色。

    这里也值得一看:Using Role Claims in ASP.NET Identity Core

    【讨论】:

    • 何时调用 Task Setup()?我们正在使用 Windows 身份验证,因此我不希望用户在任何地方登录,而是在他们第一次请求时从我的服务中设置他们的声明和角色。这样授权部分就可以在点网核心域内处理了。
    【解决方案2】:

    我通过使用需求解决了它

    public class CustomFunctionRequirement : IAuthorizationRequirement
    {
        public CustomFunctionRequirement(string function)
        {
            Function = function;
        }
    
        public string Function { get; }
    }
    

    处理程序

    public class CustomFunctionHandler : AuthorizationHandler<CustomFunctionRequirement>
    {
        private readonly Service _service;
    
        public CustomFunctionHandler(Service service)
        {
            _service = service;
        }
    
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomFunctionRequirement requirement)
        {
            var functions = _service.GetFunctions(context.User.Identity.Name);
    
            if (functions.Any(x => x == requirement.Function))
            {
                context.Succeed(requirement);
            }
    
            return Task.CompletedTask;
        }
    }
    

    在启动中的 ConfigureServices 中设置

            services.AddMvc(
                config =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                    config.Filters.Add(new AuthorizeFilter(policy));
                });
    
            services.AddAuthorization(
                options =>
                {
                    options.AddPolicy("User", policy => policy.Requirements.Add(new CustomRequirement("User")));
                });
    

    我现在可以在我的控制器中通过添加授权属性 [Authorize(Policy = "User")] 来指定要求。

    【讨论】:

    • 您在 startup.cs 中的身份验证设置如何?
    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2016-02-15
    相关资源
    最近更新 更多