我有一个网站,其中包含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
令牌。
答案 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)]