简体   繁体   English

Openiddict 可以创建令牌但似乎无效

[英]Openiddict can create token but seems to be invalid

following problem I can create a token but when I use it the authentication failed, I try to copy from an example but I had problems because some methods are not "there".以下问题我可以创建一个令牌,但是当我使用它时,身份验证失败,我尝试从一个示例中复制,但我遇到了问题,因为某些方法不“存在”。 (like principal.SetScopes, but it seems to be exist in the Github repository and in other examples) The only error I get is the failure of the AuthorizationFilter. (如 principal.SetScopes,但它似乎存在于 Github 存储库和其他示例中)我得到的唯一错误是 AuthorizationFilter 失败。 Here the method for creating the token这里是创建令牌的方法

 [HttpPost("~/connect/token"), Produces("application/json")]
    public async Task<IActionResult> Exchange(OpenIdConnectRequest connectRequest)
    {
        if (connectRequest.IsPasswordGrantType())
        {
            var user = await _userManager.FindByNameAsync(connectRequest.Username);

            if (user == null)
            {
                return Forbid(
                    authenticationSchemes: OpenIddictServerDefaults.AuthenticationScheme,
                    properties: new AuthenticationProperties(new Dictionary<string, string>
                    {
                        [OpenIdConnectConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidGrant,
                        [OpenIdConnectConstants.Properties.ErrorDescription] = "The username/password couple is invalid."
                    }));
            }

        var result = await _signInManager.CheckPasswordSignInAsync(user, connectRequest.Password, lockoutOnFailure: true);
        if (!result.Succeeded)
        {
            return Forbid(
                authenticationSchemes: OpenIddictValidationDefaults.AuthenticationScheme,
                properties: new AuthenticationProperties(new Dictionary<string, string>
                {
                    [OpenIdConnectConstants.Properties.Error] = Errors.InvalidGrant,
                    [OpenIdConnectConstants.Properties.ErrorDescription] = "The username/password couple is invalid."
                }));
        }

        var principal = await _signInManager.CreateUserPrincipalAsync(user);

        //principal.SetScopes(new[]
        //{
        //    Scopes.OpenId,
        //    Scopes.Email,
        //    Scopes.Profile,
        //    Scopes.Roles
        //}.Intersect(connectRequest.GetScopes()));

        //foreach (var claim in principal.Claims)
        //{
        //    claim.SetDestinations(GetDestinations(claim, principal));
        //}

        var sign = SignIn(principal, OpenIddictServerDefaults.AuthenticationScheme);
        return sign;
    }

    throw new Exception("Not supported");
}
    
 Here is my startup




public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<DocumentiveContext>((provider, builder) =>
        {
            var configuration = provider.GetService<IConfiguration>();
            builder.UseSqlServer(configuration.GetConnectionString("connectionString"));
            builder.UseOpenIddict();
        });

    services.AddIdentity<ApplicationUser, IdentityRole>(options =>
        {

        })
        .AddEntityFrameworkStores<DocumentiveContext>()
        .AddDefaultTokenProviders();

    services.ConfigureApplicationCookie(options =>
    {
        options.Events.OnRedirectToAccessDenied = context =>
        {
            context.Response.StatusCode = 401;
            return Task.CompletedTask;
        };
        options.Events.OnRedirectToLogin = context =>
        {
            context.Response.StatusCode = 401;
            return Task.CompletedTask;
        };
    });

    services.Configure<IdentityOptions>(options =>
    {
        options.ClaimsIdentity.UserNameClaimType = Claims.Name;
        options.ClaimsIdentity.UserIdClaimType = Claims.Subject;
        options.ClaimsIdentity.RoleClaimType = Claims.Role;
    });

    services.AddAuthentication(options =>
        options.DefaultScheme = OpenIddictValidationDefaults.AuthenticationScheme);

    services.AddOpenIddict(builder =>
    {
        builder.AddCore(coreBuilder => coreBuilder.UseEntityFrameworkCore().UseDbContext<DocumentiveContext>());
        builder.AddServer(serverBuilder =>
        {
            serverBuilder.UseMvc();
            //serverBuilder.EnableTokenEndpoint("/connect/token");

            serverBuilder.EnableAuthorizationEndpoint("/connect/authorize")
                .EnableLogoutEndpoint("/connect/logout")
                .EnableTokenEndpoint("/connect/token")
                .EnableUserinfoEndpoint("/connect/userinfo")
                .EnableUserinfoEndpoint("/connect/verify");
            serverBuilder.AllowPasswordFlow();
            serverBuilder.RegisterScopes(Scopes.Email, Scopes.Profile, Scopes.Roles, "demo_api");
            serverBuilder.AddDevelopmentSigningCertificate();


            serverBuilder.AcceptAnonymousClients();
            serverBuilder.DisableHttpsRequirement();
        });
        builder.AddValidation(validationBuilder =>
        {
        });

    });

    services.AddMvc(options => options.EnableEndpointRouting = false);

    services.AddGrpc();
    services.AddTransient<IUserInformationService, UserInformationService>();
}

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

    app.UseAuthentication();
    app.UseStaticFiles();
    app.UseSerilogRequestLogging();
    app.UseAuthorization();

    app.UseMvcWithDefaultRoute();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();

        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
        });
    });
}

} }

Any idea?

After updating to the newest Version 3 of Openiddict, it works.更新到 Openiddict 的最新版本 3 后,它可以工作了。 Also I needed to set the Authentication Scheme in the attribute.我还需要在属性中设置身份验证方案。

[Authorize(AuthenticationSchemes = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme)]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM