使用ASP.NET Core 2.2和OIDC未授权用户时,自动重定向到外部权限

问题描述 投票:4回答:1

我正在尝试通过OpenID Connect协议使用外部授权服务器来保护我的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]属性添加到控制器操作,当我尝试打开页面时,我将被重定向到/Identity/Account/Login系统页面,其中Use another service to log in.部分出现按钮OpenIdConnect以通过远程认证服务器登录。

此按钮有效 - 它会重定向到授权服务器,并在成功登录后打开/Identity/Account/ExternalLogin,并提出填写缺少的本地注册用户声明(特别是电子邮件)的提案。 事实上,当然,地址/signin-oidc首先打开,我相信,该处理程序根据收到的授权代码完成身份验证过程。

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

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

c# asp.net-core openid-connect oidc
1个回答
2
投票

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

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

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

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

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

例如,如果OAuth2.0身份验证成功,我们应该为当前用户设置cookie或发出JWT令牌。


至于你的问题,最简单的方法是将一个cookie方案注册到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);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.