C# 身份服务器和客户端在一个应用程序中-通过令牌授权不起作用

C# 身份服务器和客户端在一个应用程序中-通过令牌授权不起作用,c#,oauth,asp.net-core-mvc,openiddict,C#,Oauth,Asp.net Core Mvc,Openiddict,我正在创建web应用程序,包括API和OAuth授权代码流用户授权。所以我有了AccountController [HttpGet("/connect/auth")] public IActionResult Authorize(CancellationToken cancellationToken) { var request = HttpContext.GetOpenIdConnectRequest(); var application = _applicationRepo

我正在创建web应用程序,包括API和OAuth授权代码流用户授权。所以我有了
AccountController

[HttpGet("/connect/auth")]
public IActionResult Authorize(CancellationToken cancellationToken)
{
    var request = HttpContext.GetOpenIdConnectRequest();

    var application = _applicationRepository.Table
            .FirstOrDefault(x => x.ClientId == request.ClientId);

    if (application == null)
    {
        ModelState.AddModelError(string.Empty, "Application not recognized");
        return BadRequest(ModelState);
    }

    var parameters = request.GetParameters()
            .ToDictionary(parameter => parameter.Key, parameter => parameter.Value.ToString());

    return View(new AuthorizeModel
    {
        ApplicationName = application.DisplayName,
        Parameters = parameters,
        Scope = request.Scope
    });
}

[HttpPost("/connect/auth/accept")]
[ValidateAntiForgeryToken]
public IActionResult AuthorizeAccept(CancellationToken cancellationToken)
{
    var request = HttpContext.GetOpenIdConnectRequest();

    var identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme);
        identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, User.FindFirstValue(ClaimTypes.NameIdentifier)));

    var application = _applicationRepository.Table
        .FirstOrDefault(x => x.ClientId == request.ClientId);

    if (application == null)
    {
        ModelState.AddModelError(string.Empty, "Application not recognized");
        return BadRequest(ModelState);
    }

    var ticket = new AuthenticationTicket(
            new ClaimsPrincipal(identity),
            new AuthenticationProperties(),
            OpenIdConnectServerDefaults.AuthenticationScheme);

    ticket.SetScopes(
        /* openid: */ OpenIdConnectConstants.Scopes.OpenId,
        /* email: */ OpenIdConnectConstants.Scopes.Email,
        /* profile: */ OpenIdConnectConstants.Scopes.Profile);
    ticket.SetResources("resource_server");

    return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
}
和我的
启动
类配置

// services
services.AddIdentity<ApplicationUser, IdentityRole>(setup =>
    {
        setup.Password.RequireDigit = false;
        setup.Password.RequireLowercase = false;
        setup.Password.RequireNonAlphanumeric = false;
        setup.Password.RequireUppercase = false;
        setup.Password.RequiredLength = 6;
    })
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

services.AddOpenIddict<ApplicationDbContext>()
    .AddMvcBinders()
    .EnableAuthorizationEndpoint("/connect/auth")
    .EnableTokenEndpoint("/connect/token")
    .AllowAuthorizationCodeFlow()
    .DisableHttpsRequirement()
    .UseJsonWebTokens()
    .AddEphemeralSigningKey();

services.AddMvc();

// app configuration
app.UseIdentity();

app.UseOAuthValidation();

app.ApplicationServices.GetRequiredService<IOptions<OpenIddictOptions>>().Value.Provider = new AuthorizationProvider();
app.UseOpenIddict();

// Used to make OpenId connect request available for auth accept route
public class AuthorizationProvider : OpenIddictProvider<OpenIddictApplication, OpenIddictAuthorization, OpenIddictScope, OpenIddictToken>
{
    public override Task MatchEndpoint(MatchEndpointContext context)
    {
        if (context.Options.AuthorizationEndpointPath.HasValue && context.Request.Path.StartsWithSegments(context.Options.AuthorizationEndpointPath))
            context.MatchAuthorizationEndpoint();

        return Task.FromResult(0);
    }
}
//服务
服务。附加属性(设置=>
{
setup.Password.RequireDigit=false;
setup.Password.RequireLowercase=false;
setup.Password.RequireNonAlphanumeric=false;
setup.Password.RequireUppercase=false;
setup.Password.RequiredLength=6;
})
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddOpenIddict()
.AddMvcBinders()
.EnableAuthorizationEndpoint(“/connect/auth”)
.EnableTokenEndpoint(“/connect/token”)
.AllowAuthorizationCodeFlow()
.DisableHttpsRequirement()
.UseJsonWebTokens()的
.AddEphemeralSigningKey();
services.AddMvc();
//应用程序配置
app.UseIdentity();
app.useAuthValidation();
app.ApplicationServices.GetRequiredService().Value.Provider=new AuthorizationProvider();
app.UseOpenIddict();
//用于使OpenId连接请求可用于身份验证接受路由
公共类授权提供程序:OpenIddictProvider
{
公共覆盖任务MatchEndpoint(MatchEndpointContext上下文)
{
if(context.Options.AuthorizationEndpointPath.HasValue&&context.Request.Path.StartsWithSegments(context.Options.AuthorizationEndpointPath))
context.MatchAuthorizationEndpoint();
返回Task.FromResult(0);
}
}
因此,我可以登录并获取访问令牌,但当我使用令牌对具有
[Authorize]
属性的控制器进行API调用时,它不会将我识别为授权用户。我还注意到
OpenIddictTokens
表中记录的
ApplicationId
AuthorizationId
值为空。
有什么问题?

您不能将JWT访问令牌与验证中间件(
app.useAuthValidation())
一起使用,因为它只能使用默认格式

请删除
.UseJsonWebTokens()
以使用默认的访问令牌格式,或者使用JWT承载中间件(
app.useJWTBeareAuthentication(…)
),它应该可以工作