我有一个自定义用户类MyPrincipal
与一些自定义属性,我想用它替换验证的ClaimsPrincipal
,例如, HttpContext.User
如何在授权后替换ASP.NET Core中的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);
}
}
我已经注册了中间件认证之后运行,但MVC中Startup.cs
前:
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));
});
}
突然,_Layout
的User
只是一个ClaimsPrincipal
。
我该如何阻止MVC取代我的委托人,或在授权策略完成后挂钩到管道中?
P.S.我使用的是ASP.NET Core 2.0 Preview 2,以防万一。
稍后在中间件管道中覆盖您的用户对象? – DavidG
@DavidG我的唯一其他中间件是MVC;我最好的猜测是它发生在PolicyEvaluator中:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator.cs#L33 –