我正在一个网站上工作,我需要通过服务授权用户。如果我使用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时相同的方式访问用户名?
答案 0 :(得分:0)
在我看来,这不是正确的做法。 ASP.NET Identity提供了丰富的类,您可以覆盖和扩展这些类以满足您的要求。
如果你想在某些自定义服务上注入角色,那么你应该覆盖RoleStore(也可能是RoleManager)并注入你的自定义角色。
答案 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;)]。