gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:13:23 26 4
gpt4 key购买 nike

我正在尝试创建自己的 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. 如果没有有效的 auth cookie,使用我的 auth 进行挑战,如果成功则创建一个 auth cookie

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

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

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

附言我查看了其他几篇文章和文章(包括 thisthisthis ),但无法从中找到问题的答案。任何帮助将不胜感激。

最佳答案

我认为您所追求的可以通过 ASP.NET Core 2.1 中的一些新部分来解决

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

下面是如何根据 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 .

关于c# - ASP.NET Core 使用带有 cookieauthentication 的自定义身份验证处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50370935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com