첫 번째 .net 코어 2 웹 응용 프로그램 구현을 시작했습니다. 불행하게도 비즈니스 요구 사항으로 인해 사용자는 레거시 양식 로그인을 통해 인증을 받아야하고 사용자 이름/비밀번호는 oracle db로 처리되며 사용자가 인증되면 세션 ID가 생성되어 실행되는 앱의 기본 URL에 추가됩니다. 아주 오래된 학교지만 작동합니다.ClaimsIdentity와의 문제 .NET Core 2 Middleware Solution
세션 ID가 만료되었으므로 세션 ID가 유효해야합니다. 간단히 말해, 쿼리 문자열에서 Oracle API로 가져온 세션 ID를 전달하고 응답은 이름, 성 등과 같은 사용자 정보가 포함 된 개체입니다.
이 API 호출이 성공적으로 완료된 후 새로운 ClaimsIdentity와 Principal을 만들고 SignInAsync() 메서드를 호출하십시오.
저는 현재 내 Startup.cs에 등록한 사용자 정의 미들웨어에서이 작업을 수행합니다. 나는 이것을 Login Controller 메소드에서 일반적인 방법으로 처리 할 것이지만, 내 앱에는 로그인이 없으므로 다른 방법은 볼 수 없지만 내가 작성한 미들웨어에서 볼 수있다.
public class AuthenticationHandler
{
private readonly RequestDelegate _next;
private HttpService _httpService;
public AuthenticationHandler(RequestDelegate next, HttpService httpService)
{
_httpService = httpService;
_next = next;
}
public async Task Invoke(HttpContext context, [FromServices] HttpService httpService)
{
if (context.Request.Query.Count == 1)
{
var sessionId = context.Request.Query.FirstOrDefault().Value;
var session = await _httpService.ValidateSession(sessionId);
if (!string.IsNullOrEmpty(session?.UserId))
{
var claims = new List<Claim>()
{
new Claim(CustomClaimTypes.UserId, session.UserId),
new Claim(CustomClaimTypes.BuId, session.BuId),
new Claim(CustomClaimTypes.SecurityLevel, session.SecurityLevel)
};
var identity = new ClaimsIdentity(claims, "TNReadyEVP");
var principal = new ClaimsPrincipal(identity);
await Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.SignInAsync(context, principal);
var isIn = principal.Identity.IsAuthenticated;
var isAuthed = (context.User.Identity as ClaimsIdentity).IsAuthenticated;
await _next.Invoke(context);
}
else
{
Terminate(context);
}
}
return;
}
private async void Terminate(HttpContext context)
{
context.Response.StatusCode = 401;
await context.Response.WriteAsync("Invalid User");
return;
}
}
public static class MiddlewareExtensions
{
public static IApplicationBuilder ValidateSession(this IApplicationBuilder builder)
{
return builder.UseMiddleware<AuthenticationHandler>();
}
}
지금까지 그렇게 좋은 해결책이라고 생각합니다. 그러나 아래에 표시된 것처럼 내 API에있는 작은 API를 통해 클레임을 가져 오려고하면 클레임이 비어 있고 User.Identity.Authenticated가 false입니다.
무엇이 여기에 있습니까? 조언 주셔서 감사합니다, 이것은 내가 전에 다루지 않았던 이상한 가장자리 경우 중 하나입니다 ... 따라서 맞춤 미들웨어에 대한 필요성.
[HttpGet("claims")]
public async Task<IEnumerable<Claim>> Get()
{
var claims = (User as ClaimsPrincipal).Claims;
return await Task.FromResult(claims);
}
자세한 내용은 Thx를 참조하십시오. 당신은 내가 지난 밤에 실험을하고 있었을 때 매우 유용한 점을 만들었습니다. 나는 미들웨어가 의도하지 않은 경우에 작동하도록 강제하는 결론에 도달했습니다. CookieAuthenticationHandler에 대한 문서 검토 및 이에 대한 내용은 다음을 참조하십시오. https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x 기본적으로 많은 코드가 있습니다. 준비, 리팩터링 만하면됩니다. 몇 가지 다른 경우가 있습니다. 특정 URL 경로에 도달했을 때만 인증 공급자를 해고하는 것 외에는 좋은 시작을 얻은 것 같습니다 ... 감사합니다! –