Есть ли способ добавить претензии в промежуточное ПО ASP.NET Core после аутентификации? - PullRequest
0 голосов
/ 14 ноября 2018

У меня это при запуске:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseSwaggerWithUi();

    app.UseAuthentication();
    app.UseMiddleware<SomeMiddleware>();

    app.UseMvc();
}

Мне нужно добавить некоторые дополнительные утверждения ПОСЛЕ аутентификации пользователя, но функция Invoke промежуточного программного обеспечения всегда срабатывает перед Auth (HttpContext.User.Identity.IsAuthenticated isложный).Но когда он попадает в контроллер, пользователь аутентифицируется нормально.

Есть идеи, что здесь делать?Я попытался поставить "app.UseAuthentication ()" после вызова app.UseMiddleware, но это не влияет.

В настоящее время я использую несколько схем аутентификации.Я не уверен, оказывает ли это влияние.

Ответы [ 4 ]

0 голосов
/ 21 мая 2019

Предпочтительным способом для .NET Core 2.x является использование IClaimsTransformation , для этого используется единственный метод TransformAsync (ClaimsPrincipal) с примечанием

Предоставляет центральную точку преобразования для изменения указанного главный. Примечание: это будет выполняться при каждом вызове AuthenticateAsync, поэтому безопаснее вернуть новый ClaimsPrincipal, если ваше преобразование не идемпотент.

В зависимости от характера обогащения я добавляю претензии к существующей аутентифицированной идентичности или создаю новую идентичность и отмечаю ее как аутентифицированную. Со второй идеей вы можете сделать свой метод идемпотентным, проверив свою индивидуальность перед попыткой обогащения.

0 голосов
/ 14 ноября 2018

Это зависит от того, что вы хотите сделать и какую схему вы используете.

Например, если вы используете JwtBearer, то вы можете использовать JwtBearerOptions.Events для обработки определенных событий, вызванных промежуточным программным обеспечением. Вам нужно установить это в вашем ConfigureServices методе Startup класса.

Это даст вам более детальный контроль над тем, в каком конкретном случае вы хотите добавить свои претензии, например, OnTokenValidated.

0 голосов
/ 11 февраля 2019

Да, это возможно, но вместо добавления в список существующих утверждений вам нужно добавить новый идентификатор типа ClaimsIdentity.

public class SomeMiddleware
{
    private readonly RequestDelegate _next;

    public SomeMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        if (httpContext.User != null && httpContext.User.Identity.IsAuthenticated)
        {
            var claims = new List<Claim>
            {
                new Claim("SomeClaim", "SomeValue")
            };

            var appIdentity = new ClaimsIdentity(claims);
            httpContext.User.AddIdentity(appIdentity);

            await _next(httpContext);
        }
    }
}
0 голосов
/ 14 ноября 2018

Вы можете добавить другое промежуточное ПО сразу после UseAuthentication(), чтобы добавить претензии:

app.UseAuthentication();
app.Use(async(context, next)=>{
    if(context.User !=null && context.User.Identity.IsAuthenticated){
        // add claims here 
        context.User.Claims.Append(new Claim("type-x","value-x"));
    }
    await next();
});

//  call other middlewares 
app.UseMiddleware<SomeMiddleware>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...