身份验证后,是否可以在ASP.NET Core中间件中添加声明?

时间:2018-11-14 02:21:03

标签: c# asp.net-core

我的启动中有这个

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为false)。但是,当它击中控制器时,用户便可以通过身份验证。

有什么想法在这里做什么?我尝试在调用app.UseMiddleware之后放入“ app.UseAuthentication()”,但这没有任何影响。

我当前正在使用多种身份验证方案。我不确定这是否有影响。

5 个答案:

答案 0 :(得分:4)

您可以编写自己的中间件来添加新声明。

public class YourCustomMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext httpContext)
    {
        if (httpContext.User != null && httpContext.User.Identity.IsAuthenticated)
        {

            httpContext.User.Identities.FirstOrDefault().AddClaim(new Claim("your claim", "your field"));
        }
        await _next(httpContext);
    }
}

并在您的应用启动时

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

答案 1 :(得分:2)

是可以的,但是您不必添加现有声明的列表,而必须添加类型为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);
        }
    }
}

答案 2 :(得分:0)

您可以在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>();

答案 3 :(得分:0)

这取决于您要做什么以及使用哪种方案。

例如,如果您使用JwtBearer,则可以利用JwtBearerOptions.Events处理中间件引发的特定事件。您需要在ConfigureServices类的Startup方法中进行设置。

这将使您可以更精确地控制要添加声明的确切案例,例如OnTokenValidated

答案 4 :(得分:0)

.NET Core 2.x的首选方法是使用IClaimsTransformation,它具有一个带有注释的单一方法TransformAsync(ClaimsPrincipal)

  

提供一个中央转换点来更改指定的   主要。注意:这将在每个AuthenticateAsync调用上运行,因此   如果您的转换是安全的,则返回新的ClaimsPrincipal更安全   不是幂等的。

根据扩充的性质,我将权利要求添加到现有的经过身份验证的身份中,或者使用身份创建新的身份并将其标记为已身份验证。通过第二个想法,您可以通过在尝试进行丰富化之前检查自定义身份来使方法具有幂等性。