我有一个自定义用户类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,以防万一。
答案 0 :(得分:3)
PolicyEvaluator
正在验证取代AuthenticationScheme
的{{1}}。要解决此问题,请从Principal
构造函数中删除AuthenticationScheme
参数。
AuthorizationPolicyBuilder
这会将策略应用于所有身份验证方案,并假设您已在其他位置调用var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
。