2017-08-02 14 views
3

カスタムのユーザークラスがMyPrincipalで、いくつかのカスタムプロパティがあります。これは、認証されたClaimsPrincipalの代わりに使用します。 HttpContext.User認証後にASP.NETコアの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に:私の_Layout.cshtml

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

私が使用したいです〜からのカスタムプロパティ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.私はASP.NET Core 2.0プレビュー2を使用しています。

+0

ユーザオブジェクトを上書きするミドルウェアパイプラインの後に何かがありますか? – DavidG

+0

@DavidG唯一の他のミドルウェアはMVCです。私の最高の推測は、PolicyEvaluatorで起こります:https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator.cs#L33 –

答えて

2

PolicyEvaluatorPrincipalの代わりにAuthenticationSchemeを認証しています。これを修正するには、AuthorizationPolicyBuilderコンストラクタのAuthenticationSchemeパラメータを削除します。

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

これは、すべての認証スキームにポリシーを適用し、あなたが他の場所でHttpContext.Authentication.SignInAsyncと呼ばれていることを想定しています。

+0

偉大な、トリックをしたなぜ私は完全に理解していない:) Btw、あなたは "コメントに記載されている"とはどういう意味ですか?どのコメントを参照していますか? –

+1

'HttpContext'の' Principal'を 'PolicyEvaluator'が置き換えているソースの場所をリンクしました:https://github.com/aspnet/Security/blob/a4458191c700437a00603116ad92633d1590319d/src/Microsoft.AspNetCore.Authorization.Policy/PolicyEvaluator .cs#L33。 – Romoku

+0

私はAuthorizationPolicyBuilderでスキームを指定すると、認証と認可の両方を行いますが、認可ビットだけに興味があります。これに関する良い文書を見つけるのは難しいですが、あなたの答えにもう一度感謝します。 –

関連する問題