如何从asp.net core 1x升级到asp.net core 2双重身份验证

时间:2017-10-16 01:01:01

标签: c# asp.net-core asp.net-core-mvc jwt entity-framework-core

我在asp.net核心中有以下双重身份验证,api的JWT和MVC的身份,以及一些授权。看起来核心2已经改变很多,升级后我得到错误,我不知道如何转移代码。请帮忙。谢谢。以下是startup.cs代码(适用于asp.net core 1x):

 public Startup(IHostingEnvironment env)
    {


        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)

            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)

            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)

            .AddEnvironmentVariables();
             Configuration = builder.Build();
            Log.Logger = new LoggerConfiguration()

            .MinimumLevel
            .Warning()
            .WriteTo.RollingFile("Logs/GateKeeperLog-{Date}.txt")
            .CreateLogger();
    }

    public static IConfigurationRoot Configuration { get; set; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(Configuration);
        services.AddDbContext<GkEnterpriseContext>(options =>
        options.UseSqlServer(Configuration["Database:Connection"]));
        services.AddTransient<IUnitOfWork, UnitOfWork>();
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<GkEnterpriseContext>()
            .AddDefaultTokenProviders();
        services.AddMvc()
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.Formatting = Formatting.Indented;
            }).AddJsonOptions(options =>
            {
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

            });

        services.AddAuthorization(opt =>
        {
            opt.AddPolicy("GkDevices",
                policy => policy
                    .RequireClaim("family_name", "GkDevice"));

        });

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddSerilog();
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }


       JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

        app.UseWhen(context => context.Request.Path.Value.Contains("/api")

        , builder =>
        {
            builder.UseJwtBearerAuthentication(new JwtBearerOptions
            {
                AutomaticAuthenticate = true,
                AutomaticChallenge = true,
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer = Configuration["Tokens:Issuer"],
                    ValidAudience = Configuration["Tokens:Audidence"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes
                        (JwtTokenIssuer.PrivateKey)),
                    ValidateLifetime = true,
                    SaveSigninToken = true,

                    NameClaimType = JwtRegisteredClaimNames.FamilyName
              }

            });


        });

        app.UseWhen(context => context.Request.Path.Value.StartsWith("/api/v2/computers/")

            , coxt =>

                coxt.MapWhen((ctx) =>
                {

                    var deviceName = ctx.User.Claims.SingleOrDefault(c => c.Type == JwtRegisteredClaimNames.GivenName)?.Value ?? "";
                    var testPath = new Microsoft.AspNetCore.Http.PathString($"/api/v2/computers/{deviceName}");

                    var pathMatch = ctx.Request.Path.StartsWithSegments(testPath);
                    return String.IsNullOrWhiteSpace(deviceName) || !pathMatch;


                }, cfg =>
                {
                    cfg.Run((req) =>
                    {
                        req.Response.StatusCode = 403;
                        return req.Response.WriteAsync("Sorry, you cannot access this resource...");
                    });
                }));


        app.UseIdentity();
        app.UseStatusCodePagesWithReExecute("/StatusCodes/{0}");
        app.UseStaticFiles();


        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute(
                name: "defaultApi",
                template: "api/v2/{controller}/{id?}");
        });




    }

0 个答案:

没有答案