Security ASP.Net内核中的自定义身份验证机制
我需要从登录页面使用外部API对我的用户进行身份验证。如果来自外部API的身份验证成功,那么我会在会话中存储一个AuthToken 为了检查请求是否有效,我创建了以下授权处理程序Security ASP.Net内核中的自定义身份验证机制,security,authentication,asp.net-core,handler,Security,Authentication,Asp.net Core,Handler,我需要从登录页面使用外部API对我的用户进行身份验证。如果来自外部API的身份验证成功,那么我会在会话中存储一个AuthToken 为了检查请求是否有效,我创建了以下授权处理程序 public class ExtApiStoreRequirement : IAuthorizationRequirement { } public class ExtApiAuthorizationHandler : AuthorizationHandler<ExtApiStoreRequirement>
public class ExtApiStoreRequirement : IAuthorizationRequirement
{
}
public class ExtApiAuthorizationHandler : AuthorizationHandler<ExtApiStoreRequirement>
{
IHttpContextAccessor _accessor;
public ExtApiAuthorizationHandler(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ExtApiStoreRequirement requirement)
{
var authState = GET_AUTH_FROM_SESSION(_accessor.HttpContext.Session);
if (authState!=null)
{
_accessor.HttpContext.Response.Redirect("/Account/Login");
//context.Fail(); <-- I removed that because it was responding an empty page
context.Succeed(requirement);
}
else
context.Succeed(requirement);
return Task.CompletedTask;
}
}
这种方法很有效,但我没有信心,因为我必须调用context.success(requirement)代码>以使重定向生效。如果我调用context.Fail()
,则不会发生重定向,我看到的只是一个空页面
此方法是否存在任何安全问题,否则我将安全地使用它?您的实现用于授权而不是身份验证。我认为,编写自定义身份验证中间件,而不是创建授权策略,将是适合您的案例的正确方式
首先了解如何实现自定义身份验证
要为您的案例实现上述方法,handleAuthenticationAsync应如下所示:
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
AuthenticateResult result = null;
var principal = GetPrincipalFromSession();
if(principal != null)
{
result = AuthenticateResult.Success(new AuthenticationTicket(principal,
new AuthenticationProperties(), Options.AuthenticationScheme));
}
else
{
result = AuthenticateResult.Skip();
}
return result;
}
protectedoverride异步任务handleAuthenticationAsync()
{
AuthenticateResult结果=null;
var principal=GetPrincipalFromSession();
if(主体!=null)
{
结果=AuthenticateResult.Success(新的AuthenticationTicket(主体、,
新的AuthenticationProperties(),Options.AuthenticationScheme));
}
其他的
{
结果=AuthenticateResult.Skip();
}
返回结果;
}
根据评论进行更新:
protected override async Task<bool> HandleUnauthorizedAsync(ChallengeContext context)
{
Response.Redirect(Options.LoginPath);// you need to define LoginPath
return true;
}
protectedoverride异步任务HandleUnauthorizedAsync(ChallengeContext)
{
Response.Redirect(Options.LoginPath);//您需要定义LoginPath
返回true;
}
当用户登录时,您还应该在会话中存储主体。如果未经授权,重定向到登录页面的位置在哪里?您是对的,我错过了这个。您可以将HandleUnauthorizedAsync
改写为重定向。查看我的更新。
protected override async Task<bool> HandleUnauthorizedAsync(ChallengeContext context)
{
Response.Redirect(Options.LoginPath);// you need to define LoginPath
return true;
}