我有一个带有一些自定义属性的自定义用户类 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));
});
}
突然间,_Layout
中的 User
只是一个 ClaimsPrincipal
。
我如何才能阻止 MVC 替换我的委托(delegate)人,或者在授权策略完成后连接到管道?
附言我正在使用 ASP.NET Core 2.0 Preview 2,以防万一。
最佳答案
PolicyEvaluator
正在验证替换 Principal
的 AuthenticationScheme
。要解决此问题,请从 AuthorizationPolicyBuilder
构造函数中移除 AuthenticationScheme
参数。
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
这会将策略应用于所有身份验证方案,并假定您已在别处调用了 HttpContext.Authentication.SignInAsync
。
关于c# - 授权后如何替换 ASP.NET Core 中的 HttpContext.User?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462730/