Windows身份验证/授权

时间:2017-01-13 10:55:21

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

我正在一个网站上工作,我需要通过服务授权用户。如果我使用AuthorizeAttribute(将设置User.Identities),我已设法使Windows身份验证工作。我的计划是创建一个自定义中间件,为用户设置角色/声明但上下文。未在中间件中设置用户。 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时相同的方式访问用户名?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我通过使用要求解决了它

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属性来指定需求[Authorize(Policy =&#34; User&#34;)]。