Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 使用JWT访问令牌的安全API_Asp.net Core_Openid Connect_Openiddict - Fatal编程技术网

Asp.net core 使用JWT访问令牌的安全API

Asp.net core 使用JWT访问令牌的安全API,asp.net-core,openid-connect,openiddict,Asp.net Core,Openid Connect,Openiddict,我正在使用openiddict授权代码流示例,一切都很好 然而,我想做一些改变,我正在努力做到这一点。我想配置为使用JWT令牌,而不是默认的不透明令牌,并将其分为授权服务器和资源服务器。我还有一个MCV web应用程序,它将通过httpClient与资源服务器通信 验证服务器。启动 public void ConfigureServices(IServiceCollection services) { services.AddMvc();

我正在使用openiddict授权代码流示例,一切都很好

然而,我想做一些改变,我正在努力做到这一点。我想配置为使用JWT令牌,而不是默认的不透明令牌,并将其分为授权服务器和资源服务器。我还有一个MCV web应用程序,它将通过httpClient与资源服务器通信

验证服务器。启动

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddDbContext<ApplicationDbContext>(options =>
            {
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
                options.UseOpenIddict();
            });

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

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

            services.AddOpenIddict()

                .AddCore(options =>

                    options.UseEntityFrameworkCore()
                           .UseDbContext<ApplicationDbContext>();
                })

                // Register the OpenIddict server handler.
                .AddServer(options =>
                {
                    options.UseMvc();

                    options.EnableAuthorizationEndpoint("/connect/authorize")
                           .EnableLogoutEndpoint("/connect/logout")
                           .EnableTokenEndpoint("/connect/token")
                           .EnableUserinfoEndpoint("/api/userinfo");

                    options.RegisterScopes(OpenIdConnectConstants.Scopes.Email,
                                           OpenIdConnectConstants.Scopes.Profile,
                                           OpenIddictConstants.Scopes.Roles);


                    options.AllowAuthorizationCodeFlow();
                    options.EnableRequestCaching();
                    options.DisableHttpsRequirement();
                    options.UseJsonWebTokens();
                    options.AddEphemeralSigningKey();
                });
        }
授权端点返回一个与示例完全相同的登录结果,该结果重定向到MVC应用程序,MVC应用程序随后发出一个身份验证cookie。我现在可以在我的MVC应用程序上访问受保护的资源

MVC应用程序启动

  public void ConfigureServices(IServiceCollection services)
        {

            services.Configure<PortalDetails>(options => Configuration.GetSection("PortalDetails").Bind(options));

            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
            JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(opts =>
            {
                opts.LoginPath = "/login";
                opts.LogoutPath = "/logout";
            })

            .AddJwtBearer(options =>
            {
                //Authority must be a url. It does not have a default value.
                options.Authority = "http://localhost:54540/";
                options.Audience = "mvc"; //This must be included in ticket creation
                options.RequireHttpsMetadata = false;
                options.IncludeErrorDetails = true; //
                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    NameClaimType = "sub",
                    RoleClaimType = "role"
                };
            })

            .AddOpenIdConnect(options =>
            {
                // Note: these settings must match the application details
                // inserted in the database at the server level.
                options.ClientId = "mvc";
                options.ClientSecret = "901564A5-E7FE-42CB-B10D-61EF6A8F3654";

                options.RequireHttpsMetadata = false;
                options.GetClaimsFromUserInfoEndpoint = false; // TODO: If this if true then it doesnt work??
                options.SaveTokens = true;

                // Use the authorization code flow.
                options.ResponseType = OpenIdConnectResponseType.Code;
                options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;

                // Note: setting the Authority allows the OIDC client middleware to automatically
                // retrieve the identity provider's configuration and spare you from setting
                // the different endpoints URIs or the token validation parameters explicitly.
                options.Authority = "http://localhost:54540/";

                options.Scope.Add("email");
                options.Scope.Add("roles");

                options.SecurityTokenValidator = new JwtSecurityTokenHandler
                {
                    // Disable the built-in JWT claims mapping feature.,
                    InboundClaimTypeMap = new Dictionary<string, string>()
                };

                options.TokenValidationParameters.NameClaimType = "name";
                options.TokenValidationParameters.RoleClaimType = "role";
            });

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

            services.AddHttpClient<IApiGatewayClient, ApiGatewayClient>();
            services.AddSingleton<ITokenProvider, TokenProvider>();
        }
我可以看到一个访问令牌,我将它附加到我的http请求:

_httpClient.DefaultRequestHeaders.Authorization=新身份验证HeaderValueBear,令牌

但结果是禁止的

最后,我有一个受保护的资源服务器:

资源。启动

  public void ConfigureServices(IServiceCollection services)
        {
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
            JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
            //Add authentication and set default authentication scheme
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) //same as "Bearer"
                .AddJwtBearer(options =>
                {
                    //Authority must be a url. It does not have a default value.
                    options.Authority = "http://localhost:54540";
                    options.Audience = "mvc"; //This must be included in ticket creation
                    options.RequireHttpsMetadata = false;
                    options.IncludeErrorDetails = true; //
                    options.TokenValidationParameters = new TokenValidationParameters()
                    {
                        NameClaimType = OpenIdConnectConstants.Claims.Subject,
                        RoleClaimType = OpenIdConnectConstants.Claims.Role,
                    };
                });

            services.AddMvc();
        }
我想知道这对于我的场景是否是正确的设置,因为我从我的资源服务器得到了一个禁止的结果


谢谢

这是一个包裹

将JWT承载令牌安全性集成到您的Asp Net Core 2.0+应用程序中变得轻而易举! Azure Active Directory身份验证集成。 Facebook身份验证集成。 Twitter身份验证集成。 谷歌认证集成。 还有,大摇大摆的UI集成! 它被称为AspNetCore.Security.Jwt

GitHub:

该软件包将JWT承载令牌集成到您的应用程序中,如下所示:

1.在应用程序中实现IAAuthentication接口 然后,您将自动获取端点:

/代币

/脸谱网

当您调用这些端点并成功进行身份验证时,您将获得一个JWT承载令牌

在要保护的控制器中 必须使用Authorize属性标记要保护的控制器或操作,如:

    using Microsoft.AspNetCore.Mvc;
    .
    .
    .

    namespace XXX.API.Controllers
    {
        using Microsoft.AspNetCore.Authorization;

        [Authorize]
        [Route("api/[controller]")]
        public class XXXController : Controller
        {
            .
            .
            .
        }
    }
在Swagger UI中,您将自动看到这些端点


您是否查看了ASP.NET核心日志以确定是什么导致JWT承载处理程序返回401响应?
  public void ConfigureServices(IServiceCollection services)
        {
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
            JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
            //Add authentication and set default authentication scheme
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) //same as "Bearer"
                .AddJwtBearer(options =>
                {
                    //Authority must be a url. It does not have a default value.
                    options.Authority = "http://localhost:54540";
                    options.Audience = "mvc"; //This must be included in ticket creation
                    options.RequireHttpsMetadata = false;
                    options.IncludeErrorDetails = true; //
                    options.TokenValidationParameters = new TokenValidationParameters()
                    {
                        NameClaimType = OpenIdConnectConstants.Claims.Subject,
                        RoleClaimType = OpenIdConnectConstants.Claims.Role,
                    };
                });

            services.AddMvc();
        }
using AspNetCore.Security.Jwt;
using System.Threading.Tasks;

namespace XXX.API
{
    public class Authenticator : IAuthentication
    {        
        public async Task<bool> IsValidUser(string id, string password)
        {
            //Put your id authenication here.
            return true;
        }
    }
}
using AspNetCore.Security.Jwt;
using Swashbuckle.AspNetCore.Swagger;
.
.
public void ConfigureServices(IServiceCollection services)
{
    .
    .
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new Info { Title = "XXX API", Version = "v1" });
    });

    services.AddSecurity<Authenticator>(this.Configuration, true);
    services.AddMvc().AddSecurity();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    .
    .
    .
    // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
    // specifying the Swagger JSON endpoint.
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "XXX API V1");
    });

    app.UseSecurity(true);

    app.UseMvc();
}
 {
     "SecuritySettings": {
        "Secret": "a secret that needs to be at least 16 characters long",
        "Issuer": "your app",
        "Audience": "the client of your app",
        "IdType":  "Name",
        "TokenExpiryInHours" :  2
    },
    .
    .
    .
}
    using Microsoft.AspNetCore.Mvc;
    .
    .
    .

    namespace XXX.API.Controllers
    {
        using Microsoft.AspNetCore.Authorization;

        [Authorize]
        [Route("api/[controller]")]
        public class XXXController : Controller
        {
            .
            .
            .
        }
    }