Получение претензий от Google в ASP.Net Core 2.1 с использованием OpenIdDict - PullRequest
0 голосов
/ 18 декабря 2018

У меня возникли проблемы с получением претензий от Google в веб-API ASP.Net Core 2.1 с использованием OpenIdDict.

Я выбрал «Без аутентификации» в шаблоне ASP.Net MVC, поскольку меня это не интересуетв хранении имен пользователей / паролей сам.Я буду полагаться на внешних провайдеров (таких как Google) для аутентификации.Клиент - это SPA, поэтому я использую Implicit Flow.

Мой код основан на следующих уроках (за исключением использования Google, а не GitHub): https://www.jerriepelser.com/blog/implementing-openiddict-authorization-server-part-2/

Идет токенвернулся из Google - но когда я проверяю JWT, он не содержит информации о претензиях.Чего мне не хватает?

Мой Startup.cs выглядит так:

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

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        // Register OpenIdDict database (EF Core)
        services.AddDbContext<PD.Server.DataAccess.AuthorizationDbContext>(o => 
            { 
                o.UseSqlServer(Configuration.GetConnectionString("AuthorizationDbContext"));
                o.UseOpenIddict();
            });

        // Authentication
        services.AddAuthentication(auth =>
        {
            auth.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            auth.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            auth.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        }).AddCookie()
        .AddGoogle(o =>
        {
            o.ClientId = Configuration["Authentication:Google:ClientId";
            o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
            o.CallbackPath = "/signin-google";
        });

        services.AddOpenIddict()
        .AddCore(o => o.UseEntityFrameworkCore().UseDbContext<AuthorizationDbContext>() )
        .AddServer(o =>
        {
            o.UseMvc();                                                                 // Register MVC Binder
            o.EnableAuthorizationEndpoint("/connect/authorize")
             .EnableLogoutEndpoint("/connect/logout");                                  // Enable the Authorization end-point

            o.RegisterScopes(OpenIddictConstants.Scopes.Email, 
                             OpenIddictConstants.Scopes.Profile,
                             OpenIddictConstants.Scopes.Roles);

            o.AllowImplicitFlow();                                                      // Enable Implicit Flow (i.e. OAuth2 authentication for SPA's)

            o.EnableRequestCaching();

            o.DisableHttpsRequirement();                                                // DEV ONLY!
            o.AddEphemeralSigningKey();                                                 // DEV ONLY!

        })
        .AddValidation();

        // Cors
        services.AddCors();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCors(builder =>
        {
            builder.WithOrigins("https://localhost:5001");
            builder.WithMethods("GET");
            builder.WithHeaders("Authorization");
        });

        app.UseAuthentication();
        app.UseMvcWithDefaultRoute();
        app.MigrateDatabase();

        // Configure the OpenIdDict Database (not shown)
        InitializeAsync(app.ApplicationServices, CancellationToken.None).GetAwaiter().GetResult();
    }

И мой метод аутентификации:

    [HttpGet("~/connect/authorize")]
    public IActionResult Authorize(OpenIdConnectRequest request)
    {
        if (!User.Identity.IsAuthenticated) return Challenge("Google");

        var claims = new List<Claim>();
        claims.Add(new Claim(OpenIdConnectConstants.Claims.Subject, User.FindFirstValue(ClaimTypes.NameIdentifier), OpenIdConnectConstants.Destinations.IdentityToken));
        claims.Add(new Claim(OpenIdConnectConstants.Claims.Name, User.FindFirstValue(ClaimTypes.Name), OpenIdConnectConstants.Destinations.IdentityToken));
        claims.Add(new Claim(OpenIdConnectConstants.Claims.Email, User.FindFirstValue(ClaimTypes.Email), OpenIdConnectConstants.Destinations.IdentityToken));
        claims.Add(new Claim(OpenIdConnectConstants.Claims.EmailVerified, "true", OpenIdConnectConstants.Destinations.IdentityToken));
        var identity = new ClaimsIdentity(claims, "OpenIddict");            
        var principle = new ClaimsPrincipal(identity);

        // Create a new Authentication Ticket
        var ticket = new AuthenticationTicket(principle, new AuthenticationProperties(), OpenIdConnectServerDefaults.AuthenticationScheme);

        return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
    }

Заранее спасибо.

1 Ответ

0 голосов
/ 02 января 2019

Ваши пункты назначения утверждений установлены неправильно.

При использовании конструктора Claim, который принимает 3 параметра, фактически устанавливается тип значения утверждения, а не пункт назначения (что является концепцией, специфичной для OpenIddict).

Попробуйте использовать следующий синтаксис:

claims.Add(new Claim(OpenIdConnectConstants.Claims.Email, User.FindFirstValue(ClaimTypes.Email)).SetDestinations(OpenIdConnectConstants.Destinations.IdentityToken));
...