0

ASP.NET Core 2.0 프로젝트에 Identity를 사용하여 인증을 구현하려고하는데 작동하지 않는 것 같습니다. Identity를 구현하는 마지막 프로젝트는 ASP.NET MVC 5 프로젝트 였고, 상황이 크게 바뀌 었습니다. 코어 1.0과 1.1을 건너 뛰었으므로, 필자가 읽고있는 것에서는 거의 비슷하다고 가정 했음에도 불구하고, 코어 1.0과 1.1을 생략했다.ASP.NET Core 2.0 인증이 작동하지 않습니다.

나는 나를 위해 일할 수 없다. 내가 작동하지 않는다고 말할 때, 나는 권한이 없어도 로그인 페이지로 리디렉션되지 않는다는 것을 의미합니다.

내가 한 유일한 사용자 지정은 역할을 사용하지 않으므로 자신의 사용자 저장소와 내 확장 프로그램을 구현하여 역할이 필요없는 ID를 추가하는 것입니다. 나는 내 관점에서 모든 것이 이제는 너무 복잡하기 때문에 내가 어수선한 것에 어떤 방향을 사용할 수있다.

Startup.cs

public void ConfigureServices(
    IServiceCollection services) { 
    services.AddDbContext<CustomDbContext>(); 
    services.AddTransient<IUserStore<GlobalUser>, CustomUserStore<GlobalUser>>(); 
    services.AddIdentity<GlobalUser>(); 
    services.AddMvc(); 
} 

public void Configure(
    IApplicationBuilder app, 
    IHostingEnvironment env) { 
    if (env.IsDevelopment()) { 
     app.UseDeveloperExceptionPage(); 
    } else { 
     app.UseExceptionHandler("/Home/Error"); 
    } 

    app.UseStaticFiles(); 
    app.UseAuthentication(); 
    app.UseMvc(); 
} 

ServiceCollectionExtensions.cs 난 그냥 AddIdentity<TUser, TRole> 내장의 소스를 쳐다 보면서 역할을 생략

: 여기에 지금까지있어 코드입니다 관련 항목이 없으므로 여기에 문제가 없어야합니다 ...

public static class ServiceCollectionExtensions { 
    public static IdentityBuilder AddIdentity<TUser>(
     this IServiceCollection services, 
     Action<IdentityOptions> optionsAction = null) 
     where TUser : class { 
     services.AddAuthentication(
      o => { 
       o.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; 
       o.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; 
       o.DefaultSignInScheme = IdentityConstants.ApplicationScheme; 
      }).AddCookie(
      o => { 
       o.LoginPath = new PathString("/Login"); 
       o.Events = new CookieAuthenticationEvents { 
        OnValidatePrincipal = SecurityStampValidator.ValidatePrincipalAsync 
       }; 
      }); 

     services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
     services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>(); 
     services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>(); 
     services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>(); 
     services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>(); 
     services.TryAddScoped<IdentityErrorDescriber>(); 
     services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>(); 
     services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser>>(); 
     services.TryAddScoped<UserManager<TUser>, AspNetUserManager<TUser>>(); 
     services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>(); 

     if (optionsAction != null) { 
      services.Configure(optionsAction); 
     } 

     return new IdentityBuilder(typeof(TUser), services); 
    } 
} 

MVC 5처럼 Authorize 필터를 추가해야한다고 생각했지만 전 세계적으로 그렇게 할 수 없습니다. 내가 기본 컨트롤러에 적용하면, 다음과 같은 예외를 얻을 :

없음 authenticationScheme이 지정을하고, DefaultChallengeScheme를 찾을 수없는 없었다.

그러나 나는 사용자 정의 AddIdentity 방법으로 구성표를 설정하고 있다고 생각 했습니까? 나는 약간의 지침을 사용할 수 있었고 어떤 방식 으로든 보내 주시면 감사하겠습니다.

+0

당신은 컨트롤러에서 권한 부여 속성의 일부로에 계획을 통과 했 ... 결국 내 자신의 결정의 문제인가? 이렇게 :'[Authorize (AuthenticationSchemes = IdentityConstants.ApplicationScheme)]', 또는 이와 비슷한 것? 'IdentityConstants.ApplicationScheme'이 필요한 열거 형인지 여부는 알 수 없습니다. –

+0

그래서 "Identity.Application"을 제안한 스키마로 하드 코드했는데 이제 예외는 '인증 ​​핸들러가 스키마 : Identity.Application'에 대해 인증하도록 구성되어 있지 않습니다. 나는이 계획에 어려움을 겪고있다. Identity와 쿠키 인증을 원한다는 것을 ASP.NET에 알리는 올바른 방법은 무엇입니까? – Gup3rSuR4c

답변

1

나는 그것을 알아 냈습니다. 내 자신을 AddIdentity 확장으로 만들 때 뭔가를 내려다 보았습니다. 나는 AddCookie에 대한 매개 변수로 IdentityConstants.ApplicationScheme을 전달하고, 옵션으로 전달한 것은입니다. 나는 아이덴티티 소스를 두 번 확인하고 있었고 나는 그것을 놓쳤다. 내가 그것을 추가하자 마자 모든 것이 효과가 있었다.그래서 :

//   ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ this is what was missing 
}).AddCookie(IdentityConstants.ApplicationScheme, 
o => { 

이것은

0

나는 당신과 같은 문제가있었습니다. 나는 FormsAuthentication 쿠키를 기반으로하는 커스텀 인증을 구현해야만했는데, 이것은 닷넷 코어에 존재하지 않는다. 우리는 FormsAuthentication을 사용하는 몇 가지 ASP.Net 시스템을 가지고 있으며 interop이 필요하다. 내가 해결 한 방법은 서브 클래스 AuthorizeFilter이고, 그 다음은 overrideOnAuthorizationAsync(AuthorizationFilterContext context)이다.

public class AuthFilter : AuthorizeFilter 
{ 

    public override Task OnAuthorizationAsync(AuthorizationFilterContext context) 
    { 
     if (context.Filters.Any(item => item is IAsyncAuthorizationFilter && item != this || item is IAllowAnonymousFilter)) 
     { 
      return Task.FromResult(0); 
     } 

     if (!context.HttpContext.User.Identity.IsAuthenticated) 
     { 
      context.Result = new UnauthorizedResult(); 
      return Task.FromResult(0); 
     } 

     return base.OnAuthorizationAsync(context); 
    } 

} 

는 그런 다음 ConfigureServices

services.AddMvc(options => 
{ 
    options.Filters.Add(new AuthFilter(
     new AuthorizationPolicyBuilder() 
      .RequireAuthenticatedUser() 
      .Build())); 
}); 

이 될 것입니다 기본에 Startup.cs에 그 등록을 갈 필요가 모든 사용자의 컨트롤러는 인증이 필요합니다 이것이 내가 함께 캠 것입니다. 익명 로그인이 필요한 경우 [AllowAnonymous]을 컨트롤러에 추가하십시오.

+0

내 모든 컨트롤러는'ControllerBase' 클래스에서 상속 받았기 때문에이 속성을 적용했지만, 스키마의 등록 된 핸들러를 찾지 못했다는 다른 예외를 던지고 있습니다. – Gup3rSuR4c