Blazor:IServiceCollection不包含AddDefaultIdentity

时间:2019-06-03 14:55:05

标签: c# jwt blazor .net-core-3.0

以下tutorial之后,我在Startup.cs文件中遇到了问题:

(需要向下滚动一点,对不起)

问题在于默认身份,出现以下错误:

“ IServiceCollection不包含AddDefaultIdentity的定义,并且没有可访问的扩展方法AddDefaultIdentity接受类型为第一个参数的IServiceCollection(您是否缺少using指令或程序集引用?)”

我抬起了documentation,但是我错过了我犯的错误, 我见过很多类似于我的案例,但是它们的解决方案(包括)似乎不起作用。我可以帮忙,谢谢。

如果您想看一下,

“我的”代码是HERE

1 个答案:

答案 0 :(得分:1)

如果使用Jwt自动认证,则不应添加身份...注意:AddDefaultIdentity扩展方法用于为Razor Pages和MVC添加默认的UI服务。并且还需要您添加StaticFiles。

  

还要注意其他代码及其在“配置”中的安排   方法

在您的启动课程中尝试一下:

 public class Startup
{
    //add
    public IConfiguration Configuration { get; }
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }


    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddNewtonsoftJson();

        services.AddTransient<IJwtTokenService, JwtTokenService>();


        //Setting up Jwt Authentication
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Jwt:Issuer"],
                    ValidAudience = Configuration["Jwt:Audience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
                };
            });


        services.AddResponseCompression(opts =>
        {
            opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "application/octet-stream" });
        });
    }

 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCompression();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBlazorDebugging();
            }

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(routes =>
     {
         routes.MapDefaultControllerRoute();
     });

    app.UseBlazor<Client.Startup>();
        }
    }

}

希望这对您有帮助...

更新1: *使用上面的代码更新您的Startup类 *像这样注释您的SampleDataController控制器:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 
[Route("api/[controller]")]
    public class SampleDataController : Controller
    {
    // ..
    }
  • 运行您的应用程序,然后在Postman或Fiddler中为URL发送get http请求:
  

api / SampleData / WeatherForecasts

响应应包含创建的JwtToken

执行流程摘要:将get请求发布到Web Api。对路由点WeatherForecasts的请求将重定向到Token控制器,其目的是创建Jwt令牌并将其返回给调用方。请注意,此控制器不会验证发送此请求的用户的身份...

要做:

  • 创建一个服务来存储Jwt令牌: 该服务可以将Blazor扩展用于LocalStorage和SessionStorage来存储和检索Jwt令牌。此服务可能包含IsAutenticated,GetToken等方法。

注意:您可以将Jwt令牌从服务器传递给Blazor,并将有关用户的更多详细信息作为cookie。

  • 如果用户尚未登录并尝试访问安全资源,则创建一个登录组件以登录用户

注意:如果用户已经通过身份验证,则不会重定向到“登录”表单。相反,我们会向服务器发出一个http请求,以便在Blazor中检索所需的rsources。

注意:我们如何知道我们的用户是否已通过身份验证?我们查询IsAutenticated方法。如果用户通过了身份验证,则检索Jwt令牌并将其添加到通过HttpClient调用传递的标头集合中。

更多内容……

看到了吗?