ASPNET 7 - Authentication

2022. 12. 8. 00:00ASPNET/ASPNET 7

반응형

6.0 버전에도 있었던 인증 관련 기능 이지만 aspnet core 7 부터는 조금더 간소화 되었다. 

이전 버전 같은 경우는 다음과 같은 내용들이 있었다. 

builder.Services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(token.Secret)),
        ValidIssuer = token.Issuer,
        ValidAudience = token.Audience,
        ValidateIssuer = false,
        ValidateAudience = false,
        //ClockSkew = isDevelopment ? TimeSpan.Zero : TimeSpan.FromSeconds(30)
    };
});


app.UseAuthentication();
app.UseAuthentication();

그러나 7 버전 부터는 default 설정에서 저런 부분을 처리 하는 방법이 있다. 

builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
...
app.UseAuthentication();
app.UseAuthentication();

AddJwtBearer() 에서 에러가 발생한다. 다음을 추가하자

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

 

swagger 에서 Test 하기 위해서 Swagger 관련 config 을 설정 해야 하는데 

아래와 같은 코드들을 추가하자

builder.Services.AddSwaggerGen(c =>
{ 
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "BizServer API", Version = "v1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        Name = "Bearer",
        BearerFormat = "JWT",
        Description = "Please enter authorization key",
        Scheme = "Bearer"
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement()
                {
                    {
                        new OpenApiSecurityScheme()
                        {
                             Reference = new OpenApiReference()
                             {
                                 Type = ReferenceType.SecurityScheme,
                                 Id = "Bearer"
                             }
                        },
                        Enumerable.Empty<string>().ToList()
                    }
                });
    c.CustomSchemaIds(x => x.FullName?.Replace("+", "."));
});
builder.Services.Configure<SwaggerGeneratorOptions>(opts =>
{
    opts.InferSecuritySchemes = true;
});

** Bearer 관련 문자에 대소문자를 조심하자

사실 표준으로는 대문자 B 가 아닌 소문자 b 가 와야 한다. 

원래는 bearer 로 해도 처리가 되었는데 7.0 부터 처리가 안되는것 같다. 

swashbuckle 에 bug 인지는 확실하지 않다. **

 

사용할때는 아래와 같이 사용한다. 

var route = app.MapGroup("/route")
    .RequireAuthorization().WithOpenApi(); // group 전체에 인증 요청
route.MapGet("/", () =>
{
    return $"Hello!! {DateTime.Now.Ticks}";
});

route.MapGet("/user", (string name) =>
{
    return $"Hello!! {name}";
});

하나하나에 적용 할 수도 있다. 

app.MapGet("/user", (string name) =>
{
    return $"Hello!! {name}";
}).RequireAuthorization();  // method 를 사용하여 처리

...

app.MapGet("/user", [Authorize](string name) => // attribute를 사용하여 통해 처리
{
    return $"Hello!! {name}";
});

 

관련영상

https://youtu.be/HAsGq4a9A40

 

반응형

'ASPNET > ASPNET 7' 카테고리의 다른 글

gRPC HealthCheck  (0) 2022.12.15
ASPNET 7 - Endpoint Filter  (0) 2022.12.12
ASPNET 7 - Route Group and Swagger  (0) 2022.12.05
ASPNET 7 - Rate Limit  (0) 2022.12.01
ASPNET 7 - Output Cache  (0) 2022.11.28