簡體   English   中英

OpenIdDict 未從.Net Core API 返回令牌

[英]OpenIdDict not returning Token from .Net Core API

我有一個.Net Core API 項目,我在其中使用 OpenIDDict 進行身份驗證。 我參考了官方存儲庫,但是它沒有將令牌返回給最終用戶(目前我正在使用郵遞員進行測試)

這是我的 Program.cs 文件

  //OPENID
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{ options.UseSqlServer(builder.Configuration.GetConnectionString("ApplicationDb"));
    options.UseOpenIddict();
});

// Register the Identity services.
//builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
//    .AddEntityFrameworkStores<ApplicationDbContext>()
//    .AddDefaultTokenProviders();

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

builder.Services.AddQuartz(options =>
{
    options.UseMicrosoftDependencyInjectionJobFactory();
    options.UseSimpleTypeLoader();
    options.UseInMemoryStore();
});

builder.Services.AddOpenIddict()

    // Register the OpenIddict core components.
    .AddCore(options =>
    {
            // Configure OpenIddict to use the Entity Framework Core stores and models.
            // Note: call ReplaceDefaultEntities() to replace the default OpenIddict entities.
        options.UseEntityFrameworkCore()
               .UseDbContext<ApplicationDbContext>();

            // Enable Quartz.NET integration.
        options.UseQuartz();
    })

    // Register the OpenIddict server components.
    .AddServer(options =>
    {
            // Enable the token endpoint.
        options.SetTokenEndpointUris("/connect/token");
        options.AllowPasswordFlow();
        options.AcceptAnonymousClients();
        options.AddDevelopmentEncryptionCertificate()
               .AddDevelopmentSigningCertificate();
        options.UseAspNetCore()
               .EnableTokenEndpointPassthrough();
    })

    // Register the OpenIddict validation components.
    .AddValidation(options =>
    {
        options.UseLocalServer();
        options.UseAspNetCore();
    });...

我的 AuthorizationController.cs 文件

 [HttpPost("~/connect/token"), Produces("application/json")]
public async Task<IActionResult> Exchange()
{
    var request = HttpContext.GetOpenIddictServerRequest();
    var claimsPrincipal = new ClaimsPrincipal();
    if (request.IsPasswordGrantType())
    {
        try
        {
            var user = await _userManager.FindByNameAsync(request.Username);
            if (user == null)
            {
                //Return Error message
            }

            var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, lockoutOnFailure: true);
            if (!result.Succeeded)
            {
                 //Return Error message
            }
            var principal = await _signInManager.CreateUserPrincipalAsync(user);
            principal.SetScopes(new[]
            {
            Scopes.OpenId,
            Scopes.Email,
            Scopes.Profile,
            Scopes.Roles
        }.Intersect(request.GetScopes()));

            foreach (var claim in principal.Claims)
            {
                claim.SetDestinations(GetDestinations(claim, principal));
            }
            return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
 ...

它應該返回與此答案類似的令牌,但是我在 postman 中獲得了 500 狀態。 錯誤是找不到實體類型“OpenIddictEntityFrameworkCoreToken”。 確保實體類型已添加到 model。

不確定,我需要為此創建表嗎? 還是我錯過了什么? 我可以在OpenIdDict 官方網站上看到,他們沒有提到類似的東西。

我正在使用.Net 6,VS 2022。

您是否嘗試添加?

services.AddIdentity<User, Role>()
    .AddSignInManager()
    .AddUserStore<UserStore>()
    .AddRoleStore<RoleStore>()
    .AddUserManager<UserManager<User>>();

檢查這個博客

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM