首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于JWT的API + Piranha [授权]路由

基于JWT的API + Piranha [授权]路由
EN

Stack Overflow用户
提问于 2019-01-22 19:57:42
回答 2查看 388关注 0票数 2

最近在Piranha项目中为api设置了JWT。我可以在没有Piranha劫持请求的情况下访问登录端点(匿名)。

当我碰到一个API端点(在成功的auth &接收到JWT之后)时,它就会被Piranha捕获。它试图将我重定向到CMS登录。

因为这是一个API,所以重定向到网页是不可接受的行为。为了纠正这种行为?

代码语言:javascript
复制
        var appSettingsSection = config.GetSection("AppSettings");
        services.Configure<AppSettings> (appSettingsSection);
        // configure jwt authentication
        var appSettings = appSettingsSection.Get<AppSettings> ();
        var key = Encoding.UTF8.GetBytes (appSettings.Secret); // todo - UTF8 vs ASCII?!
        services.AddAuthentication (x => {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer (x => {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey (key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });
        services.AddPiranhaApplication ();
        services.AddPiranhaFileStorage ();
        services.AddPiranhaImageSharp ();

            services.AddPiranhaEF (options =>
                options.UseSqlite ("Filename=./piranha.db"));
            services.AddPiranhaIdentityWithSeed<IdentitySQLiteDb> (options =>
                options.UseSqlite ("Filename=./piranha.db"));
        }
        services.AddPiranhaManager ();
        services.AddPiranhaMemCache ();

        services.AddMvc (config => {
                config.ModelBinderProviders.Insert (0,
                    new Piranha.Manager.Binders.AbstractModelBinderProvider ());
            }).SetCompatibilityVersion (CompatibilityVersion.Version_2_1);

-

代码语言:javascript
复制
[ApiController]
[Route ("api/v1/")]
[Produces("application/json")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class ApiController : ControllerBase {
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-22 21:07:35

这里的问题是ASP.NET标识是如何与JWT交互的。在你的创业中,你的使命:

代码语言:javascript
复制
services.AddPiranhaIdentityWithSeed<IdentitySQLiteDb> (options =>
    options.UseSqlite ("Filename=./piranha.db"));

这意味着设置使用默认选项Piranha集,其中一些选项实际上更适合开发(比如密码强度)。您可以在方法中提供自己的optionscookie options,如下所示:

代码语言:javascript
复制
services.AddPiranhaIdentityWithSeed<IdentitySQLiteDb> (options =>
    options.UseSqlite ("Filename=./piranha.db"), identityOptions, cookieOptions);

使用的默认标识选项是:

代码语言:javascript
复制
// Password settings
options.Password.RequireDigit = false;
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
options.Password.RequiredUniqueChars = 1;

// Lockout settings
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
options.Lockout.MaxFailedAccessAttempts = 10;
options.Lockout.AllowedForNewUsers = true;

// User settings
options.User.RequireUniqueEmail = true;

这些是默认的cookie选项:

代码语言:javascript
复制
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
options.LoginPath = "/manager/login";
options.AccessDeniedPath = "/manager/login";
options.SlidingExpiration = true;

诚挚的问候

菅直人

票数 2
EN

Stack Overflow用户

发布于 2021-01-15 19:53:21

如果您仍然希望在API端点中使用Cookie Auth,下面的内容可能会有效,但有一些注意事项。要设置它,请执行以下操作:

  1. 为每个Håkan's post提供默认选项,根据需要进行更新
  2. cookieOptions.Events.OnRedirectToLogin添加自定义处理程序。

注意事项:

  1. 如果没有响应,.NET核心仍将重新定向.
  2. 如果您正在使用CORs,则不再自动发送标头,因此您需要弄清楚如何做到这一点。
  3. 我正在使用Axios客户端在我的前端项目。在默认情况下,即使withCredentials参数设置为true,Axios也不会发送带PUT/DELETE请求的cookie。
代码语言:javascript
复制
identityOptions => 
                {
                    // Password settings
                    identityOptions.Password.RequireDigit = false;
                    identityOptions.Password.RequiredLength = 6;
                    identityOptions.Password.RequireNonAlphanumeric = false;
                    identityOptions.Password.RequireUppercase = false;
                    identityOptions.Password.RequireLowercase = false;
                    identityOptions.Password.RequiredUniqueChars = 1;

                        // Lockout settings
                        identityOptions.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
                        identityOptions.Lockout.MaxFailedAccessAttempts = 10;
                        identityOptions.Lockout.AllowedForNewUsers = true;

                        // User settings
                        identityOptions.User.RequireUniqueEmail = true;

                    },
                    cookieOptions => 
                    {
                        cookieOptions.Cookie.HttpOnly = true;
                        cookieOptions.ExpireTimeSpan = TimeSpan.FromMinutes(30);
                        cookieOptions.LoginPath = "/manager/login";
                        cookieOptions.AccessDeniedPath = "/manager/login";
                        cookieOptions.SlidingExpiration = true;

                        var defaultAction = cookieOptions.Events.OnRedirectToLogin;
                        cookieOptions.Events.OnRedirectToLogin = (context) =>
                        {

                            if (context.Request.Path.Value.StartsWith("/api"))
                            {
                                context.Response.StatusCode = 401;
                                context.Response.BodyWriter.WriteAsync(new ReadOnlyMemory<byte>(Encoding.ASCII.GetBytes("unauthorized.")));
                                return Task.CompletedTask;
                            }
                            else
                            {
                                return defaultAction(context);
                            }
                        };
                    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54315575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档