ASP에서 여러 인증 방식을 설정하려면 어떻게 해야 합니까?NET Core 2.0?
인증 항목을 코어 2.0으로 마이그레이션하려고 하는데 자체 인증 방식을 사용하여 문제가 있습니다.시작할 때의 서비스 설정은 다음과 같습니다.
var authenticationBuilder = services.AddAuthentication(options =>
{
options.AddScheme("myauth", builder =>
{
builder.HandlerType = typeof(CookieAuthenticationHandler);
});
})
.AddCookie();
컨트롤러의 로그인 코드는 다음과 같습니다.
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Name)
};
var props = new AuthenticationProperties
{
IsPersistent = persistCookie,
ExpiresUtc = DateTime.UtcNow.AddYears(1)
};
var id = new ClaimsIdentity(claims);
await HttpContext.SignInAsync("myauth", new ClaimsPrincipal(id), props);
그러나 컨트롤러나 작업 필터에 있으면 ID가 하나뿐이고 인증된 ID는 아닙니다.
var identity = context.HttpContext.User.Identities.SingleOrDefault(x => x.AuthenticationType == "myauth");
이러한 변경 사항을 탐색하는 것은 어려웠지만, 제가 그렇게 하고 있는 것 같습니다.스키마 추가가 잘못되었습니다.좋은 의견이라도 있나?
편집: 사용자에게 두 개의 ID 집합이 발생하지 않는 깨끗한 앱이 있습니다.ID:
namespace WebApplication1.Controllers
{
public class Testy : Controller
{
public IActionResult Index()
{
var i = HttpContext.User.Identities;
return Content("index");
}
public async Task<IActionResult> In1()
{
var claims = new List<Claim> { new Claim(ClaimTypes.Name, "In1 name") };
var props = new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddYears(1) };
var id = new ClaimsIdentity(claims);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id), props);
return Content("In1");
}
public async Task<IActionResult> In2()
{
var claims = new List<Claim> { new Claim(ClaimTypes.Name, "a2 name") };
var props = new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddYears(1) };
var id = new ClaimsIdentity(claims);
await HttpContext.SignInAsync("a2", new ClaimsPrincipal(id), props);
return Content("In2");
}
public async Task<IActionResult> Out1()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return Content("Out1");
}
public async Task<IActionResult> Out2()
{
await HttpContext.SignOutAsync("a2");
return Content("Out2");
}
}
}
시작:
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie("a2");
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
2019년 12월 편집: 다른 것보다 이 답변을 먼저 고려해 주시기 바랍니다.다중 JWT 베어러 인증 사용
이전 답변(사용자가 언급한 대로 JWT를 여러 개 사용하는 것은 맞지 않고 JWT + API 키만 사용하는 것):
http 인증 베어러 토큰 헤더 또는 쿠키를 가질 수 있는 경우가 있었는데, 어떤 인증 정책 방식을 선택할지 런타임에 결정하는 것도 가능합니다.
https://github.com/aspnet/Security/issues/1469 덕분입니다.
요청 헤더에 있는 JWT 토큰, OpenIdConnect(Azure AD) 또는 기타 다른 것이 있으면 JWT 토큰을 사용합니다.
public void ConfigureServices(IServiceCollection services)
{
// Add CORS
services.AddCors();
// Add authentication before adding MVC
// Add JWT and Azure AD (that uses OpenIdConnect) and cookies.
// Use a smart policy scheme to choose the correct authentication scheme at runtime
services
.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = "smart";
sharedOptions.DefaultChallengeScheme = "smart";
})
.AddPolicyScheme("smart", "Authorization Bearer or OIDC", options =>
{
options.ForwardDefaultSelector = context =>
{
var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
if (authHeader?.StartsWith("Bearer ") == true)
{
return JwtBearerDefaults.AuthenticationScheme;
}
return OpenIdConnectDefaults.AuthenticationScheme;
};
})
.AddJwtBearer(o =>
{
o.Authority = Configuration["JWT:Authentication:Authority"];
o.Audience = Configuration["JWT:Authentication:ClientId"];
o.SaveToken = true;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddAzureAd(options => Configuration.Bind("AzureAd", options));
services
.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
// Authentication is required by default
config.Filters.Add(new AuthorizeFilter(policy));
config.RespectBrowserAcceptHeader = true;
});
...
}
2019년 07월 07일 편집: 다음 제안에 링크를 추가해야 합니다. 왜냐하면 그것도 매우 도움이 되기 때문입니다: 당신은 파라미터를 사용할 수 없습니다.AddAuthentication()내가 그랬듯이, 왜냐하면 이것은 기본 계획을 세울 것이기 때문입니다.여기에는 모든 것이 잘 설명되어 있습니다.여러 JWT 베어러 인증을 사용합니다.저는 이 다른 방법이 정말 마음에 들어요!
이러한 변경 사항을 탐색하는 것은 어려웠지만, 제가 그렇게 하고 있는 것 같습니다.스키마 추가가 잘못되었습니다.
사용하지 마십시오.AddScheme: 핸들러 작가를 위해 고안된 낮은 수준의 방법입니다.
ASP에서 여러 인증 방식을 설정하려면 어떻게 해야 합니까?NET Core 2.0?
쿠키 핸들러를 등록하려면 다음 작업을 수행하기만 하면 됩니다.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = "myauth1";
})
.AddCookie("myauth1");
.AddCookie("myauth2");
}
public void Configure(IApplicationBuilder app)
{
app.UseAuthentication();
// ...
}
}
1.x에서 할 수 있는 것처럼 여러 개의 기본 구성을 등록할 수는 없습니다(이 대규모 리팩토링의 핵심은 여러 개의 자동 인증 미들웨어가 동시에 존재하지 않도록 하는 것입니다).
2.0에서 이 동작을 반드시 에뮬레이트해야 하는 경우 수동으로 호출하는 사용자 지정 미들웨어를 작성할 수 있습니다.AuthenticateAsync()를 생성합니다.ClaimsPrincipal필요한 모든 신원을 포함하고 있습니다.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = "myauth1";
})
.AddCookie("myauth1");
.AddCookie("myauth2");
}
public void Configure(IApplicationBuilder app)
{
app.UseAuthentication();
app.Use(async (context, next) =>
{
var principal = new ClaimsPrincipal();
var result1 = await context.AuthenticateAsync("myauth1");
if (result1?.Principal != null)
{
principal.AddIdentities(result1.Principal.Identities);
}
var result2 = await context.AuthenticateAsync("myauth2");
if (result2?.Principal != null)
{
principal.AddIdentities(result2.Principal.Identities);
}
context.User = principal;
await next();
});
// ...
}
}
https://stackoverflow.com/a/51897159/4425154's 솔루션이 도움이 됩니다.언급된 해결책 위에 고려해야 할 몇 가지 항목이 있습니다.
- .net core run-time 2.1 이상을 사용하고 있는지 확인합니다.
미들웨어를 사용하는 경우 아래에 언급된 대로 인증 정책을 확인하십시오.
services.AddMvc(options => { var defaultPolicy = new AuthorizationPolicyBuilder(new[] { CookieAuthenticationDefaults.AuthenticationScheme, JwtBearerDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme }) .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(defaultPolicy)); })
AddDefaultIdentity 및 Blazor Wasm JwtBearer와 함께 Blazor 서버를 사용하는 경우 @HotN 솔루션 확장
services.AddAuthentication(opt =>
{
opt.DefaultAuthenticateScheme = "smart";
opt.DefaultChallengeScheme = "smart";
})
.AddPolicyScheme("smart", "Authorization Bearer or OIDC", options =>
{
options.ForwardDefaultSelector = context =>
{
var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
if (authHeader?.ToLower().StartsWith("bearer ") == true)
{
return JwtBearerDefaults.AuthenticationScheme;
}
return IdentityConstants.ApplicationScheme;
};
})
.AddCookie(cfg => cfg.SlidingExpiration = true)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["ValidIssuer"],
ValidAudience = jwtSettings["ValidAudience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["securityKey"])),
};
});
//******Startup=>ConfigureServices******
services.AddAuthentication(option =>
{
option.DefaultScheme = "AdministratorAuth";
})
.AddCookie("AdministratorAuth", "AdministratorAuth", option =>
{
option.Cookie.Name = "AdministratorAuth";
option.LoginPath = new PathString("/AdminPanel/Login");
option.ExpireTimeSpan = TimeSpan.FromMinutes(14400);
option.AccessDeniedPath = "/Error/UnAuthorized";
option.LogoutPath = "/Security/Logout";
})
.AddCookie("UsersAuth", "UsersAuth", option =>
{
option.Cookie.Name = "UsersAuth";
option.LoginPath = new PathString("/Security/LoginUser/");
option.ExpireTimeSpan = TimeSpan.FromMinutes(144000);
option.AccessDeniedPath = "/Error/UnAuthorized";
option.LogoutPath = "/Security/LogoutUser";
});
//______________________________________________________________
//******Startup=> Configure******
app.UseAuthentication();
app.UseCookiePolicy();
//______________________________________________________________
//******Admin Login******
var status = HttpContext.SignInAsync("AdministratorAuth", new ClaimsPrincipal(principal), properties)IsCompleted;
//******OtherUsers Login******
var status = HttpContext.SignInAsync("UsersAuth", new ClaimsPrincipal(principal), properties)IsCompleted;
//______________________________________________________________
[Authorize(AuthenticationSchemes = "AdministratorAuth")]
public class DashboardController : BaseController
{
}
누군가 해결책을 필요로 할 경우, 제가 한 일은 이렇습니다.
services.AddMvc(options =>
{
var defaultPolicy = new AuthorizationPolicyBuilder().AddAuthenticationSchemes(IdentityServerAuthenticationDefaults.AuthenticationScheme, BasicAuthenticationDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(defaultPolicy));
});
services.AddAuthentication()
.AddIdentityServerAuthentication(option config here)
.AddBasicAuthentication(setting);
언급URL : https://stackoverflow.com/questions/45695382/how-do-i-setup-multiple-auth-schemes-in-asp-net-core-2-0
'programing' 카테고리의 다른 글
| 형제 값을 기반으로 한 노드와 XPath 일치 (0) | 2023.09.11 |
|---|---|
| 데이터베이스 세션과 관련하여 데이터베이스 잠금 및 웹 서버가 어떻게 협업합니까? (0) | 2023.09.11 |
| __getitem__에서 슬라이싱 구현 (0) | 2023.09.11 |
| ASP 버전이 충돌합니다.검색된 NET 웹 페이지: 지정된 버전이 "1.0.0.0"이지만 빈의 버전이 "2.0.0.0"입니다. (0) | 2023.09.11 |
| 다른 컨테이너에서 mysql 컨테이너에 액세스 (0) | 2023.09.11 |