2017-08-02 40 views
3

我有一个自定义用户类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)); 
    }); 
} 

突然,_LayoutUser只是一个ClaimsPrincipal

我该如何阻止MVC取代我的委托人,或在授权策略完成后挂钩到管道中?

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

+0

稍后在中间件管道中覆盖您的用户对象? – DavidG

+0

@DavidG我的唯一其他中间件是MVC;我最好的猜测是它发生在PolicyEvaluator中:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator.cs#L33 –

回答

2

PolicyEvaluator正在验证AuthenticationScheme,它取代了Principal。要解决此问题,请从AuthorizationPolicyBuilder构造函数中删除AuthenticationScheme参数。

var policy = new AuthorizationPolicyBuilder() 
    .RequireAuthenticatedUser() 
    .Build(); 

这将政策适用于所有身份验证方案,并假定你已经调用HttpContext.Authentication.SignInAsync别处。

+0

太棒了,那就是诀窍,即使我不完全明白为什么:)顺便说一下,“评论中提到”是什么意思?你指的是哪些评论? –

+1

您链接了'PolicyEvaluator'替代'HttpContext'上的'Principal'的源位置:https://github.com/aspnet/Security/blob/a4458191c700437a00603116ad92633d1590319d/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator的.cs#L33。 – Romoku

+0

明白了,所以如果我在AuthorizationPolicyBuilder中指定一个方案,它将执行身份验证和授权,而我只对授权位感兴趣。很难找到这方面的好文档,再次感谢您的回答。 –