【问题标题】:ASP.NET Core using custom authenticationhandler with cookieauthenticationASP.NET Core 使用带有 cookieauthentication 的自定义身份验证处理程序
【发布时间】:2018-10-26 12:16:16
【问题描述】:

我正在尝试创建自己的 AuthenticationHandler 并与 cookie 身份验证一起使用:

services.AddAuthentication(options =>
  {
  options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultChallengeScheme = MyAuth.Scheme;
  })
  .AddCookie()
  .AddScheme<MyAuthenticationOptions, MyAuthenticationHandler>(MyAuth.Scheme, "My auth scheme", options => { });

public MyAuthenticationHandler(...) : base(...) {}

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        throw new NotImplementedException();  
    }    

    protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
    {                     
        var myUser = await DoAuth();

        if (!myUser.IsAuthenticated)
        {
            if (Context.Request.Query.ContainsKey("isRedirectedFromSSO"))
            {
                Context.Response.Redirect("/unauthorized");
                return;
            }
            else
            {
                Context.Response.Redirect("url to sso");
                return;
            }              
        }    

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.NameIdentifier, user.Username),            
        };

        var identity = new ClaimsIdentity(claims, MyAuth.Scheme);
        var claimsPrincipal = new ClaimsPrincipal(identity);

        var authProperties = new AuthenticationProperties {};

        await Context.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            claimsPrincipal,
            authProperties);

        Context.Response.Redirect(Request.GetEncodedUrl());
    }
}
  1. 如果存在有效的身份验证 cookie,则使用该身份验证
  2. 如果没有有效的身份验证 cookie,请使用我的身份验证进行质询,如果成功则创建身份验证 cookie

这在实践中有效,但我觉得有点奇怪,我在HandleChallenge 中进行实际身份验证,如果失败则重定向。 从另一个 (MyAuthenticationHandler) 调用一个 AuthenticationHandler (cookie) 在我看来也很奇怪。

我怎样才能正确设置它,以便我在 HandleAuthenticate 中进行实施? 在我当前的实现中,该方法实际上从未被调用过。

另外,可以从另一个身份验证处理程序调用吗?

附:我查看了其他几篇帖子和文章(包括thisthisthis),但我无法通过查看它们找到我的问题的答案。任何帮助将不胜感激。

【问题讨论】:

  • 链接多个中间件怎么样?
  • 如何做到这一点?你能链接到一个基本的例子吗? :)
  • 谁是您的 SSO 身份提供者?
  • 我想我一开始误解了这个问题。现在我想我知道问题是什么了。为什么你在HandleChallenge而不是HandleAuthentication做这个过程?
  • 这正是我的问题:)

标签: c# asp.net security authentication asp.net-core


【解决方案1】:

我认为您所追求的可能会通过 ASP.NET Core 2.1 中的一些新功能来解决

&lt;PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.1.0-rc1-final" /&gt;

以下是如何根据 httpcontext 数据“选择”身份验证方案的示例:

builder.AddPolicyScheme("scheme", "scheme", opts =>
{
    opts.ForwardDefaultSelector = ctx =>
    {
        if (ctx.Request.Query.ContainsKey("isRedirectedFromSSO"))
        {               
            return null; // or ctx.ForbidAsync(), not sure here.
        }

        return OpenIdConnectDefaults.AuthenticationScheme; // or your own sso scheme, whatever it may be here.
    };
})
.AddCookie()
.AddOpenIdConnect();

看看this GitHub thread

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2017-02-15
  • 2018-02-24
  • 2016-07-05
  • 2020-05-20
相关资源
最近更新 更多