如何在授权后替换ASP.NET Core中的HttpContext.User?

时间:2017-08-02 13:46:58

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

我有一个自定义用户类MyPrincipal,其中包含一些自定义属性,我希望将其替换为经过身份验证的ClaimsPrincipal,例如HttpContext.User

我添加了一个自定义中间件:

public class MyMiddleware {
  private readonly RequestDelegate next;

  public MyMiddleware(RequestDelegate next) {
    this.next = next;
  }

  public async Task Invoke(HttpContext context) {
    if (context.User.IsAuthenticated) {
      context.User = new MyPrincipal(context.User);
    }
    await next(context);
  }
}

我已经注册了中间件,在身份验证后运行,但在Startup.cs中的MVC之前:

public void Configure(IApplicationBuilder app) {
  app.UseAuthentication();
  app.UseMiddleware<MyMiddleware()>;
  app.UseMvcWithDefaultRoute();
}

在我的_Layout.cshtml中,我想使用MyPrincipal中的自定义属性:

...
@if (User is MyPrincipal) {
  <do stuff>
}
...

到目前为止,用户被识别为MyPrincipal

但是当我添加全局授权政策时:

public void ConfigureServices(IServiceCollection services) {
  services.AddMvc(options => {
    var policy = new AuthorizationPolicyBuilder(CookieAuthenticationDefaults.AuthenticationScheme)
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
  });
}

突然,User中的_Layout只是ClaimsPrincipal

如何在授权政策完成后阻止MVC更换我的主体,或挂钩到管道?

P.S。我正在使用ASP.NET Core 2.0 Preview 2,以防万一。

1 个答案:

答案 0 :(得分:3)

PolicyEvaluator正在验证取代AuthenticationScheme的{​​{1}}。要解决此问题,请从Principal构造函数中删除AuthenticationScheme参数。

AuthorizationPolicyBuilder

这会将策略应用于所有身份验证方案,并假设您已在其他位置调用var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build();