gpt4 book ai didi

c# - 当用户未使用 ASP.NET Core 2.2 和 OIDC 获得授权时自动重定向到外部权限

转载 作者:太空狗 更新时间:2023-10-29 23:28:20 25 4
gpt4 key购买 nike

我正在尝试通过 OpenID Connect 协议(protocol)使用外部授权服务器来保护我的 ASP.NET MVC Web 应用程序(特别是 - KeyCloak,但我认为它并不那么重要)。
我必须找到的所有示例基本上都是安装 Microsoft.AspNetCore.Authentication.OpenIdConnect nuget 包并向 Startup 类添加一些配置代码:

services
.AddAuthentication()
.AddOpenIdConnect(options =>
{
options.Authority = authUrl;
options.ClientId = clientId;
options.ClientSecret = clientSecret;
options.ResponseType = OpenIdConnectResponseType.Code;
});

然后,如果我将 [Authorized] 属性添加到 Controller 操作,当我尝试打开页面时,我将被重定向到 /Identity/Account/Login 系统页面,在 Use another service to log in. 部分出现按钮 OpenIdConnect 以通过远程身份验证服务器登录。

此按钮有效 - 它重定向到授权服务器,并在成功登录后打开 /Identity/Account/ExternalLogin 并建议填写缺少的本地注册用户声明(特别是 -电子邮件)。
实际上,地址/signin-oidc当然是先打开的,我相信哪个handler会根据接收到的授权码完成认证过程。

但是,除了 OpenIDConnect 之外,我不需要任何其他授权方法。我需要将未经授权的用户立即重定向到远程授权服务器。

如何阻止其他登录方法并直接重定向到授权服务器,而不是 ASP.NET 登录页面?

最佳答案

However, I don't need any other authorization methods except OpenIDConnect. I need an unauthorized user to be immediately redirected to a remote authorization server.

How can I prevent other login methods and redirect directly to the authorization server, but not to the ASP.NET login page?

的确,有一种方法可以直接重定向到授权服务器,而无需访问任何本地登录页面。

但通常我们仍然需要另一个SignInScheme。如果您查看源代码,您会发现当远程身份验证处理程序成功对某个用户进行身份验证时,它会sign the user in。 :

   // ...
await Context.SignInAsync(SignInScheme, ticketContext.Principal, ticketContext.Properties);
// ...

例如,如果OAuth2.0认证成功,我们应该为当前用户设置cookie或颁发JWT token


关于你的问题,最简单的方法是注册一个 cookie scheme 到 Challenge/Signin :

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect("MyOIDC", options =>
{
// ...
}

现在您可以随心所欲地使用[Authorize]。没有ASP.NET Core Identity,上面的代码对我来说完美无缺。

[更新]:抱歉,我忘了说我们必须自定义挑战过程:

  1. 方法 1:为 Cookie 配置前向挑战方案:
    services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>{
options.ForwardChallenge ="MyOIDC";

})
.AddOpenIdConnect("MyOIDC", options =>
{
// ....
}
  1. 方法 2:手动调用挑战方案:
    public class AccountController : Controller
{
public async Task Login(string returnUrl = "/")
{
await HttpContext.ChallengeAsync("MyOIDC", new AuthenticationProperties() { RedirectUri = returnUrl });
}

// if you need sign out the MyOIDC service, you could sign out the user for two schemes as below :
[Authorize]
public async Task Logout()
{
await HttpContext.SignOutAsync("MyOIDC", new AuthenticationProperties
{
RedirectUri = Url.Action("Index", "Home")
});
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}

关于c# - 当用户未使用 ASP.NET Core 2.2 和 OIDC 获得授权时自动重定向到外部权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869767/

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