2015-11-20 9 views
21

以前に動作していたアプリケーションでRC 5フレームワークベータ8パッケージをアップデートしました。私は次のエラーを実行しているそれを得た後、起動プロセス中に発生しました:スキームを処理する認証ハンドラが設定されていません。自動

InvalidOperationException: No authentication handler is configured to handle the scheme: Automatic Microsoft.AspNet.Http.Authentication.Internal.DefaultAuthenticationManager.d__12.MoveNext()

var defaultPolicy = 
    new AuthorizationPolicyBuilder() 
    .RequireAuthenticatedUser() 
    .Build(); 

services.AddMvc(setup => 
{ 
    setup.Filters.Add(new AuthorizeFilter(defaultPolicy)); // Error occurs here 
}); 

誰でも同様の問題を持っていた場合、私は間違っているかもしれないものにあなたのアイデアやソリューションをいただければと思います。この例外の説明も認められています。

Startup.cs

using Autofac; 
using Autofac.Extensions.DependencyInjection; 
using Microsoft.AspNet.Authorization; 
using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Hosting; 
using Microsoft.AspNet.Http; 
using Microsoft.AspNet.Mvc.Filters; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.PlatformAbstractions; 
using SuperUserMVC.Configuration; 
using SuperUserMVC.Extensions; 
using SuperUserMVC.GlobalModules; 
using System; 

namespace SuperUserMVC 
{ 
    public class Startup 
    { 
     public IConfigurationRoot Configuration { get; set; } 

     // Entry point for the application. 
     public static void Main(string[] args) => WebApplication.Run<Startup>(args); 

     public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(appEnv.ApplicationBasePath) 
       .AddJsonFile("appsettings.json"); 

      Configuration = builder.Build(); 
     } 

     public IServiceProvider ConfigureServices(IServiceCollection services) 
     { 
      services.Configure<AppSettingsBase>(Configuration.GetSection("AppSettingsBase")); 
      services.Configure<ConnectionString>(Configuration.GetSection("ConnectionString")); 

      services.AddSqlServerCache(cache => 
      { 
       cache.ConnectionString = Configuration.Get<string>("ASPState:ConnectionString"); 
       cache.SchemaName = Configuration.Get<string>("ASPState:Schema"); 
       cache.TableName = Configuration.Get<string>("ASPState:Table"); 
      }); 

      services.AddSession(session => 
      { 
       session.IdleTimeout = TimeSpan.FromMinutes(120); 
      }); 

      // Only allow authenticated users. 
      var defaultPolicy = new AuthorizationPolicyBuilder() 
       .RequireAuthenticatedUser() 
       .Build(); 

      // Add MVC services to the services container. 
      services.AddMvc(setup => 
      { 
       setup.Filters.Add(new AuthorizeFilter(defaultPolicy)); 
      }); 

      var builder = new ContainerBuilder(); 
      builder.RegisterModule(new AutofacModule()); 
      builder.Populate(services); 

      var container = builder.Build(); 

      return container.Resolve<IServiceProvider>(); 
     } 

     public void Configure(IApplicationBuilder app, IHttpContextAccessor httpContextAccessor) 
     { 
      // Catch unhandled exception in pipeline. 
      bool isProductionEnvironment = Configuration.Get<bool>("environmentVariables:isProductionEnvironment"); 
      app.UseCustomUnhandledException(isProductionEnvironment, Configuration.Get<string>("defaultErrorPagePath")); 

      // Log requests. 
      app.UseVisitLogger(isProductionEnvironment); 

      // Session must be used before MVC routes. 
      app.UseSession(); 

      // Configure the HTTP request pipeline. 
      app.UseCookieAuthentication(options => 
      { 
       options.AuthenticationScheme = "Cookies"; 
       options.LoginPath = new PathString("/Account/Login/"); 
       options.AccessDeniedPath = new PathString("/Account/Forbidden/"); 
       options.CookieName = "MyCookie"; 
       options.AutomaticAuthenticate = true; 
       options.SessionStore = new MemoryCacheSessionStore(); 
      }); 

      AutoMapperInitializer.Init(); 
      app.UseStaticFiles(); 

      // Route configuration. 
      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "AreaDefault", 
        template: "{area:exists=Demo}/{controller=Home}/{action=Index}/{id?}" 
       ); 

       routes.MapRoute(
        name: "Default", 
        template: "{controller=Home}/{action=Index}/{id?}" 
       ); 
      }); 
     } 
    } 
} 
+0

私はちょうど最後のベータ(新しいプロジェクトを作成し、それを少し強化した)でasp.netを開発し始めたばかりでなく、さまざまなBASEのものを変更したので、RCへのアップデート後に問題がありました。残念ながら私は説明を見つけられませんでした。どのように既存のプロジェクトを互換性のあるものに変更するのですか?だから...私は完全に互換性があるように、新しいテンプレートから自分のプロジェクトを最初から作り直しました。 RCはMSの生産のためにサポートされているので、将来的にはそのような変更はないと思います(リリース版第1四半期リリース)。 – FredyWenger

答えて

28

は、あなたのクッキーオプションでoptions.AutomaticChallenge = true;を設定してみてください、それが動作するはずです。

options.AutomaticAuthenticationoptions.AutomaticAuthenticateoptions.AutomaticChallengeに分割した。最後の値がfalseのままになっていると、認証ミドルウェアが承認フィルタによって適用されたチャレンジを処理しないため、例外がスローされます。

+0

もう一度ありがとう、これは私の問題を解決した! :) – msmolcic

+4

あなたがクッキーを使用しない場合はどうなりますか? –

+1

@ AlexHopeO'Connor、私はGoogle認証オプションに直接設定しました – SiberianGuy

0

startup.csファイル内で、当社の構成設定の多くを置くために魅力的ですが、物事の好ましい方法は、あなたのapp.UseCookieAuthentication()設定しているようだ - startup.csファイル内で、次に「オプションのすべてを置く - サンセリフオプションを別のファイル内の他の詳細を含むことができます。

Global.asaxファイルに、Asp.Net vBeforeのApp_Startフォルダファイルへのポインタがどのように格納されていたかのようなものでした。

startup.csでEF/Sqlを設定しようとしているときに同様の苦痛を受け、startup.csの外にあるすべての「オプション」を移動すると、作業がはるかに改善されました。

また、あなたの質問にFredy Wengerのコメントを書き留めて、v -8betaからv -RC1-finalまでの名前空間の多くの名前変更を指摘してください。

20

これをConfigureメソッドに置きます。

 app.UseIdentity(); 
+0

私はあなたが 'Configure'を意味していて、' ConfigureServices'を意味しないと思います。 – Peter

+0

私はこの行を持っていますが、まだエラーを受け取ります... –

49

私はちょうど私がAutomaticChallenge = trueを設定していたにも関わらず、このエラーに対処する多くの時間を費やしたので、うまくいけば、これは他の誰かを助けます。

app.UseIdentity();app.UseMvc(routes => ...)の後に入力すると、同じエラーが表示されます。私は答えを知ったので、それは明らかです。このミドルウェアはすべて、追加した順序で発生するためです。

これは「認証なしハンドラが設定されていない」エラーが発生します。これは、エラーが発生することはありません

public void Configure(...) 
    { 
     app.UseMvc(routes => { routes.MapRoute(...) };); 

     app.UseIdentity(); 
    } 

を:

public void Configure(...) 
    { 
     app.UseIdentity(); 

     app.UseMvc(routes => { routes.MapRoute(...); }); 
    } 
+2

ありがとう。同じことがUapp.UseOpenIdConnectAuthentication()とapp.UseCookieAuthentication()にも当てはまります。 – tjrobinson

+1

1年後でもまだ有効です。 Thx – Mariusz

+0

私のエラーは、(私が統合テストのために認証を嘲笑していたので)この呼び出しの順序です。私はそれを推測したことはありません!ありがとう! – Vetras

2

別の可能性は設定

で以下の設定が欠落しています
app.UseCookieAuthentication(); 
6

問題がありますクッキーの仕組みが参照されているどこでも一貫して名前がつけられていることを確認することで私のために解決しました。例えば:

public void ConfigureServices(IServiceCollection services) 
{ 
    // if using IdentityServer4 
    var builder = services.AddIdentityServer(options => 
    { 
     options.AuthenticationOptions.AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme; 
     ... 
    }) 

    services.AddIdentity<MyUser, IdentityRole>(options => 
    { 
     options.Cookies.ApplicationCookie.AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme; 
     ... 
    } 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    ... 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme, 
     AutomaticAuthenticate = false, 
     AutomaticChallenge = true 
    }); 
} 

認証ミドルウェアと対話するとき。例えば:

await HttpContext.Authentication.SignInAsync(Constants.DefaultCookieAuthenticationScheme, cp); 
+0

「options.AutomaticAuthenticationがoptions.AutomaticAuthenticateとoptions.AutomaticChallengeに分割されました」に関する最初の回答を実装した後も、同じエラーが返されましたが、大文字の「Cookies」をサンプルから小文字に置き換えた別の場所で綴られている)、私のアプリが動作するようになった!どうもありがとうございました! –

2

あなたがapp.UseIdentity();を使用して、いくつかの他のログインミドルウェアは、このようなUseFacebookAuthenticationようapp.UseFacebookAuthentication()app.UseIdentity();の後であることを確認した場合。

関連する問題