2017-04-03 5 views
2

오케이, 토큰 권한 부여에 Openiddict를 사용하는 .NET Core 프로젝트가 있습니다. 갑자기 MissingExceptionMethod 오류가 발생했을 때까지 지금까지 잘 작동했습니다. 정말 이상한 부분은 지난 주 완벽하게 작동했던 코드 버전에서도 똑같은 일이 일어난다는 것입니다. 마치 갑자기 아무것도 바뀌지 않고 깨진 것 같습니다. 이상하게도이 문제는 Openiddict와 함께 일어 났고 업데이트가 수정되었지만 이번에는 업데이트가 없습니다. .NET Core 1.1.1, Identity Framework 1.1.1 및 Openiddict 10.0.-beta2-0584를 사용하고 있습니다. 갑자기 그것이 경우토큰 끝점을 호출 할 때 MissingExceptionMethod 오류가 발생했습니다.

그것이 리디렉션 코드를 찾고있을 것처럼 보였다는 사실이 만든
[HttpPost("token"), Produces("application/json")] 
public async Task<IActionResult> Token(OpenIdConnectRequest request, string permissions, string appId) 
{ 
    Debug.Assert(request.IsTokenRequest(), 
     "The OpenIddict binder for ASP.NET Core MVC is not registered. " + 
     "Make sure services.AddOpenIddict().AddMvcBinders() is correctly called."); 

    if (request.IsPasswordGrantType()) 
    { 
     var user = await _userManager.FindByNameAsync(request.Username); 

     var accountTest = await TestAccount(request, user); 
     if (accountTest != null) 
      return BadRequest(accountTest.ErrorDescription); 

     // Create a new authentication ticket. 
     AuthenticationTicket ticket; 
     if (permissions != null && permissions.ToLower() == "ui") 
      ticket = await CreateTicketAsync(request, user, appId, null, true); 
     else 
      ticket = await CreateTicketAsync(request, user, appId, null, false); 

     return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme); 
    } 

    return BadRequest("UNABLETOLOGIN"); 

나를 궁금해 :

System.MissingMethodException: Method not found: 'Void AspNet.Security.OpenIdConnect.Primitives.OpenIdConnectResponse.set_RedirectUri(System.String)'. 
    at AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerHandler.<HandleSignInAsync>d__5.MoveNext() 
    at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Start[TStateMachine](TStateMachine& stateMachine) 
    at AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerHandler.HandleSignInAsync(AuthenticationTicket ticket) 
    at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.<SignInAsync>d__66.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager.<SignInAsync>d__14.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.SignInResult.<ExecuteResultAsync>d__14.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultAsync>d__30.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextResultFilterAsync>d__28.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResultExecutedContext context) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextResourceFilter>d__22.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext context) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__20.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.<Invoke>d__5.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.<Invoke>d__6.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.<Invoke>d__6.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() 

여기 토큰 엔드 포인트 코드입니다 :

여기에 전체 오류 발생 상태 코드를 반환하는 대신 오류를 리디렉션하려고했지만 오랫동안 아무 것도 변경하지 않았습니다. 다음은 Openiddict 등의 초기화 코드입니다.

services.AddDbContext<AxiomIdentityDbContext>(builder => 
{ 
    builder.UseSqlServer(connectionString); 
    builder.UseOpenIddict(); 
}); 

services.AddIdentity<AxiomApplicationUser, IdentityRole>(options => 
{ 
    options.Password.RequireDigit = true; 
    options.Password.RequireLowercase = true; 
    options.Password.RequireUppercase = false; 
    options.Password.RequireNonAlphanumeric = false; 
    options.Password.RequiredLength = 6; 
}) 
    .AddEntityFrameworkStores<AxiomIdentityDbContext>() 
    .AddDefaultTokenProviders(); 

services.Configure<IdentityOptions>(options => 
{ 
    options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name; 
    options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject; 

    options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents 
    { 
     OnRedirectToLogin = async ctx => 
     { 
      if (ctx.Request.Path.StartsWithSegments(configuration["Routes:AxiomApiRoute"]) && 
       ctx.Response.StatusCode == 200) 
      { 
       ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
       var data = Encoding.UTF8.GetBytes(string.Join(",", ctx.Request.Cookies.Keys)); 
       await ctx.Response.Body.WriteAsync(data, 0, data.Length); 
      } 
      else 
      { 
       ctx.Response.Redirect(ctx.RedirectUri); 
      } 
     } 
    }; 

    options.Cookies.ApplicationCookie.CookieSecure = CookieSecurePolicy.None; 
    options.Cookies.ApplicationCookie.CookieHttpOnly = false; 
}); 

services.AddOpenIddict(options => 
{ 
    options.AddEntityFrameworkCoreStores<AxiomIdentityDbContext>(); 
    options.AddMvcBinders(); 
    options.EnableTokenEndpoint("/api/authorization/token"); 
    options.EnableUserinfoEndpoint("/api/authorization/userinfo"); 
    options.AllowPasswordFlow(); 
    options.DisableHttpsRequirement(); 
    options.AllowRefreshTokenFlow(); 
    options.SetAccessTokenLifetime(new TimeSpan(0, 3600, 0)); 
    options.SetRefreshTokenLifetime(new TimeSpan(30, 0, 0, 0)); 
}); 

services.Configure<IdentityOptions>(config => 
{ 
    config.Cookies.ApplicationCookie.Events = 
     new CookieAuthenticationEvents() 
     { 
      OnRedirectToLogin = (ctx) => 
      { 
       if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200) 
       { 
        ctx.Response.StatusCode = 401; 
       } 

       return Task.CompletedTask; 
      }, 
      OnRedirectToAccessDenied = (ctx) => 
      { 
       if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200) 
       { 
        ctx.Response.StatusCode = 403; 
       } 

       return Task.CompletedTask; 
      } 
     }; 

}); 

이 오류의 원인은 무엇입니까?

업데이트 - 여기 csproj

<Project Sdk="Microsoft.NET.Sdk"> 

    <PropertyGroup> 
    <TargetFramework>netstandard1.6</TargetFramework> 
    <GenerateDocumentationFile>true</GenerateDocumentationFile> 
    <AssemblyName>Axiom.Web.Api.Authentication</AssemblyName> 
    <PackageId>Axiom.Web.Api.Authentication</PackageId> 
    <NetStandardImplicitPackageVersion>1.6.1</NetStandardImplicitPackageVersion> 
    <PackageTargetFallback>$(PackageTargetFallback);dnxcore50</PackageTargetFallback> 
    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> 
    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> 
    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> 
    </PropertyGroup> 

    <ItemGroup> 
    <ProjectReference Include="..\Axiom.Common.Web\Axiom.Common.Web.csproj" /> 
    <ProjectReference Include="..\Axiom.Services.Interfaces\Axiom.Services.Interfaces.csproj" /> 
    <ProjectReference Include="..\Axiom.Services.Implementations\Axiom.Services.Implementations.csproj" /> 
    <ProjectReference Include="..\Axiom.DataAccess.EntityFramework\Axiom.DataAccess.EntityFramework.csproj" /> 
    </ItemGroup> 

    <ItemGroup> 
    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="1.1.0" /> 
    <PackageReference Include="AspNet.Security.OAuth.Validation" Version="1.0.0-beta1-final" /> 
    <PackageReference Include="OpenIddict" Version="1.0.0-beta2-0584" /> 
    <PackageReference Include="OpenIddict.Mvc" Version="1.0.0-beta2-0584" /> 
    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.1.3" /> 
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.AspNetCore.Cors" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.AspNetCore.Identity" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.1" /> 
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="1.1.1" /> 
    </ItemGroup> 

</Project> 
+1

패키지간에 버전이 일치하지 않습니다. – Pawel

+0

.-beta2가 가장 가능성이 높습니다. –

+0

project.json/.csproj 파일을 공유 할 수 있습니까? – Pinpoint

답변

1

당신이 버전 불일치로 인해 발생보고있는 문제입니다 : 모든 프로젝트가 최신 비트 (1.0.0-beta2-0584)를 참조하고 있는지 확인하고 그것을 작동합니다.