在.net核心上正确设置双重(混合)授权配置

时间:2019-05-13 15:59:06

标签: authentication asp.net-core cookies jwt

我有一个网站,其中包含api方法。某些操作适用于浏览器和移动设备。通常,当用户打开网页时,他们将被重定向到登录页面。但是,如果用户来自移动设备,则不能将其重定向到登录页面,他们将被迫通过jwt令牌(承载者)进行身份验证

我刚刚阅读了.net文档,发现了(混合双)身份验证。

这是我使用此功能并等待您提供建议的方式

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,options =>
{
    options.ExpireTimeSpan = defaultSetup.CookieExpireTimeSpan;
    options.Cookie.Name = defaultSetup.CookieName;
    options.AccessDeniedPath = identitySettings.ThisProjectAccessDeniedPath;
    options.LoginPath = identitySettings.ThisProjectLoginPath;
    options.LogoutPath = identitySettings.ThisProjectLogoutPath;
})
.AddJwtBearer();

在我的控制器中

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class OrderController : BaseController
{
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;

如果我仅将[Authorize]CookieAuthenticationDefaults.AuthenticationScheme一起用于登录页面重定向,并且登录效果很好,但它始终会重定向到登录页面。

如果我将[Authorize]JwtBearerDefaults.AuthenticationScheme一起使用,则仅适用于Bearer令牌。

1 个答案:

答案 0 :(得分:0)

我建议您为API和网页设置单独的区域。您可能在不同的区域拥有同名的控制器。毫无疑问,这是逻辑的重复,但是您可以进行设计,以使实际的实现是可以从两个动作中调用的通用方法。

            services.AddAuthentication(options => {
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddCookie(options =>
            {
                options.AccessDeniedPath = new PathString("/Console/Account/Index/");
                options.LoginPath = new PathString("/Console/Account/Index/");
            })
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwtBearerOptions => {
                jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters {
                    ValidateAudience = false,
                    ValidateIssuer = false,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = JWT_Sec_Key,  
                    ValidateLifetime = true, //validate the expiration and not before values in the token
                    ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date
                };
            });

此处的默认身份验证为Cookie,因此在网页控制器上仅具有[授权]。

对API控制器使用[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]。

编辑:

我在某处阅读过它,您甚至可以提供两种方案

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme +“,” + CookieAuthenticationDefaults.AuthenticationScheme)]

请尝试一下,让我知道...

EDIT2: 可以使用多个注释。参考:https://github.com/auth0-samples/aspnet-core-mvc-plus-webapi

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]