【问题标题】:Update asp.net core Authentication outside of Startup.cs在 Startup.cs 之外更新 asp.net 核心身份验证
【发布时间】:2021-10-01 03:44:09
【问题描述】:

关于 asp.net 核心身份管理,我们需要在我们的 asp.net 核心应用程序启动后更改 Microsoft ClientId 和 ClientSecret,因此不在 startup.cs 中。我们有各种可以正常使用的身份管理登录,例如 Microsoft Azure:

            .AddMicrosoftAccount(microsoftOptions =>
            {
                microsoftOptions.CorrelationCookie.HttpOnly = true;
                microsoftOptions.CorrelationCookie.SecurePolicy = CookieSecurePolicy.Always;
                microsoftOptions.ClientId = "removed";
                microsoftOptions.ClientSecret = "removed";
            })

我们现在需要在核心应用程序启动后动态更改 ClientId 和 ClientSecret,但我们无法弄清楚如何稍后在其他页面中从服务集合中访问它,以便我们可以更新它们。

任何帮助表示赞赏。

谢谢。

【问题讨论】:

    标签: c# asp.net-core asp.net-identity


    【解决方案1】:

    ASP.NET Core 提供IAuthenticationSchemeProvider 接口来在运行时动态添加/删除身份验证方案。您可以在应用启动后注入此接口并添加 Microsoft Account 身份验证方案。

    使用Microsoft's demo app作为参考,这是一个基本的实现:

    public class DynamicAuthController: ControllerBase
    {
        private IAuthenticationSchemeProvider _schemeProvider;
        private IOptionsMonitorCache<MicrosoftAccountOptions> _optionsCache;
    
        public DynamicAuthController(IAuthenticationSchemeProvider schemeProvider, IOptionsMonitorCache<MicrosoftAccountOptions> optionsCache)
        {
            _schemeProvider = schemeProvider;
            _optionsCache = optionsCache;
        }
    
        [HttpPost]
        public ActionResult Add()
        {
            var schemeName = "MicrosoftCustom1"; // must be unique for different schemes
            var schemeOptions = new MicrosoftAccountOptions
            {
                ClientId = "ididid", // fetch credentials from another service or database
                ClientSecret = "secretsecret",
                CorrelationCookie =
                {
                    HttpOnly = true,
                    SecurePolicy = CookieSecurePolicy.Always
                }
            };
            
            var scheme = new AuthenticationScheme(schemeName, displayName:null, typeof(MicrosoftAccountHandler));
            _schemeProvider.TryAddScheme(scheme);
            _optionsCache.TryAdd(
                schemeName,
                schemeOptions
            );
    
            return Ok();
        }
    }
    

    【讨论】:

    • 谢谢 - 将探索这种方法。可惜我们不能在这里更新 ClientId 和 ClientSecret var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); ChallengeResult cr = new ChallengeResult(provider, properties);
    • 您可以通过子类化MicrosoftAccountHandler 并将凭据保存在AuthenticationProperties.Items 中并在MicrosoftAccountHandler.BuildChallengeUrl 和.ExchangeCodeAsync 中读取它来破解它,但我倾向于这种方法。
    猜你喜欢
    • 2017-01-04
    • 2019-08-05
    • 2021-06-26
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2021-06-11
    • 2017-09-13
    • 2019-11-03
    相关资源
    最近更新 更多