【问题标题】:Custom Authentication mechanism in ASP.Net CoreASP.Net Core 中的自定义身份验证机制
【发布时间】:2016-11-28 14:48:20
【问题描述】:

我需要使用登录页面中的外部 API 对我的用户进行身份验证。如果来自外部 API 的身份验证成功,那么我会在会话中存储一个 AuthToken。

为了检查请求是否有效,我创建了以下授权处理程序

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;
    }
}

我已经在我的 startup.cs 中注册了这个处理程序

  services.AddAuthorization(options =>
        {
            options.AddPolicy("ExtApi",
                              policy => policy.Requirements.Add(new ExtApiStoreRequirement()));
        });

这种方法有效,但我没有信心,因为我必须致电 context.Succeed(requirement); 才能使重定向工作。如果我调用context.Fail(),则不会发生重定向,我看到的只是一个空页面。

这种方法是否存在任何安全问题,或者我可以安全地使用它?

【问题讨论】:

    标签: security authentication asp.net-core handler


    【解决方案1】:

    您的实现是用于授权而不是身份验证。我认为与其创建授权策略,不如编写自定义身份验证中间件适合您的情况。

    先看看如何实现自定义认证Simple token based authentication/authorization in asp.net core for Mongodb datastore

    为您的案例实施上述方式HandleAuthenticateAsync 应该如下所示:

    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;
    }
    

    根据评论更新

    protected override async Task<bool> HandleUnauthorizedAsync(ChallengeContext context)
    {    
         Response.Redirect(Options.LoginPath);// you need to define LoginPath        
         return true;
    }
    

    您还应该在用户登录时将主体存储在会话中。

    【讨论】:

    • 如果没有授权,重定向到登录页面在哪里?
    • 你说得对,我错过了这个。您可以覆盖HandleUnauthorizedAsync 以进行重定向。查看我的更新。
    猜你喜欢
    • 2016-07-05
    • 2017-02-15
    • 2018-02-24
    • 2017-07-26
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多