使用带有cookie身份验证的自定义身份验证处理程序的ASP.NET Core

时间:2018-05-16 12:26:34

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

我正在尝试创建自己的AuthenticationHandler并使用Cookie身份验证:

java.net.BindException: Address already in use

ps -ef | grep netty
  1. 如果有有效的身份验证Cookie,请使用
  2. 进行身份验证
  3. 如果没有有效的身份验证Cookie,请使用我的身份验证进行质询并在成功时创建身份验证Cookie
  4. 这在实践中有效,但我觉得有点奇怪我在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 => { }); 进行实际身份验证,如果失败则重定向。 从另一个(MyAuthenticationHandler)调用一个AuthenticationHandler(cookie)对我来说似乎很奇怪。

    如何正确设置,以便我在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()); } } 执行此操作? 在我当前的实现中,该方法实际上从未被调用过。

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

    P.S。我查看过其他一些帖子和文章(包括thisthisthis),但我无法通过查看问题找到问题的答案。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我认为您之后的内容可以通过ASP.NET Core 2.1中的一些新内容来解决

<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.1.0-rc1-final" />

以下是如何&#34;选择&#34;的示例。基于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