2017-07-19 11 views
4

Identityを使用しないASP.NET MVCコアのカスタム認証を使用しています。これはStartup.csです:ユーザーの承認に失敗しました:(null)

public class Startup 
{ 
    public IConfiguration Configuration { get; set; } 

    // Configure IoC container 
    // https://docs.asp.net/en/latest/fundamentals/dependency-injection.html 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.Configure<AppSettings>(options => Configuration.GetSection(nameof(AppSettings)).Bind(options)); 

     // https://docs.asp.net/en/latest/security/anti-request-forgery.html 
     services.AddAntiforgery(options => options.CookieName = options.HeaderName = "X-XSRF-TOKEN"); 

     services.AddDbContext<DbSesamContext>(options => 
     { 
      options.UseSqlServer(Configuration.GetConnectionString("SesamConnection")); 
     }); 

     services.AddDbContext<TerminalDbContext>(options => 
     { 
      options.UseSqlServer(Configuration.GetConnectionString("TerminalConnection")); 
     }); 

     services.AddMvcCore() 
      .AddAuthorization() 
      .AddViews() 
      .AddRazorViewEngine() 
      .AddJsonFormatters(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory) 
    { 
     // Configure logging 
     // https://docs.asp.net/en/latest/fundamentals/logging.html 
     factory.AddConsole(Configuration.GetSection("Logging")); 
     factory.AddDebug(); 

     // Serve static files 
     // https://docs.asp.net/en/latest/fundamentals/static-files.html 
     app.UseStaticFiles(); 

     // Enable external authentication provider(s) 
     // https://docs.asp.net/en/latest/security/authentication/sociallogins.html 
     //app.UseIdentity(); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions() 
     { 
      AuthenticationScheme = "ResWebAuth", 
      LoginPath = new PathString("/login"), 
      AccessDeniedPath = new PathString("/unauthorized/"), 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
     }); 

     // Configure ASP.NET MVC 
     // https://docs.asp.net/en/latest/mvc/index.html 
     app.UseMvc(routes => 
     { 
      routes.MapRoute("default", "{*url}", new { controller = "Home", action = "Index" }); 
     }); 
    } 

    public static void Main() 
    { 
     var cwd = Directory.GetCurrentDirectory(); 
     var web = Path.GetFileName(cwd) == "server" ? "../public" : "public"; 

     var host = new WebHostBuilder() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseWebRoot(web) 
      .UseKestrel() 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 

と私のコントローラで:

[Authorize] 
public class HomeController : Controller 
{ 
    public async Task<IActionResult> Index() 
    { 
     ... 

     return View(); 
    } 

    [HttpGet("login")] 
    [AllowAnonymous] 
    public async Task<IActionResult> Login(string ReturnUrl) 
    { 
     ... 

     return View(); 
    } 

    [HttpPost("login")] 
    [AllowAnonymous] 
    public async Task<IActionResult> Login(LoginInfo loginInfo) 
    { 
     if (LoginUser(loginInfo.Username, loginInfo.Password)) 
     { 
      var claims = new List<Claim> 
       { 
        new Claim(ClaimTypes.Name, loginInfo.Username), 
        new Claim("DbVersion", loginInfo.Terminal.SesamDbVersion), 
        new Claim("DbUrl", loginInfo.Terminal.SesamDbUrl), 
        new Claim("DbName", loginInfo.Terminal.SesamDbName), 
        new Claim("DbUsername", loginInfo.Terminal.SesamDbUserName), 
        new Claim("DbPasswordHash", loginInfo.Terminal.SesamDbPasswordHash), 
       }; 

      var userIdentity = new ClaimsIdentity(claims, "login"); 

      ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity); 
      await HttpContext.Authentication.SignInAsync("ResWebAuth", principal); 

      //Just redirect to our index after logging in. 
      return Redirect("/"); 
     } 
     return View(); 
    } 

    [HttpGet("getchartdata")] 
    //[AllowAnonymous] 
    public JsonResult GetChartData() 
    { 
     ... 
    } 

ログ:

info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware[3] 
     HttpContext.User merged via AutomaticAuthentication from authenticationScheme: ResWebAuth. 
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1] 
     Authorization was successful for user: admin. 

... 

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 
     Request starting HTTP/1.1 GET http://localhost:5000/getchartdata/ 
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 
     Authorization failed for user: (null). 
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1] 
     Executing ChallengeResult with authentication schemes(). 
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware[12] 
     AuthenticationScheme: ResWebAuth was challenged. 
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] 
     Executed action Server.Controllers.HomeController.GetChartData (server) in 5.2905ms 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 
     Request finished in 10.1037ms 302 

だから基本的には成功し、コントローラのIndex()方法でユーザーを認証それだけには失敗しました同じコントローラーのGetChartData()メソッドで行います。

Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]の間に違いがあるようですが、それが何であり、どのように修正するのか分かりません。 ASP.Netコア2.0については

+0

なぜあなたは 'AddMvc'を使用して、代わりに' AddMvcCore'を呼び出していませんか?以下の呼び出しは 'AddMvc'が行うことを行いますので、ここに' AddMvcCore'を使用する理由はありません –

+0

これは、デフォルトで[定型句](https://github.com/kriasoft/aspnet-starter-kit)にありました。中古。 –

+0

コンストラクタなしでフルスタートアップクラスを投稿できますか? –

答えて

関連する問題