IdentityServer4-是否可以与外部提供商一起使用本地登录表格,而无需往返



我正在尝试使用本地登录表单对其外部提供商(Azure Active Directory)进行身份验证。

我了解,根据客户端,您可以启用本地登录。这是有帮助的,就像设置为真时一样,我将获得本地登录表单,但是我仍然不清楚如何为该外部提供商发射中间货车。有没有办法将客户凭据发送给外部提供商以接收ID令牌?我当前的代码将重定向到Microsoft登录;然后返回我的身份服务器,然后返回客户端应用程序。我希望用户通过身份服务器登录,但没有让他们知道它确实可以针对Azure进行身份验证。

这是我的创业:

        var schemeName = "Azure-AD";
        var dataProtectionProvibder = app.ApplicationServices.GetRequiredService<IDataProtectionProvider>();
        var distributedCache = app.ApplicationServices.GetRequiredService<IDistributedCache>();
        var dataProtector = dataProtectionProvider.CreateProtector(
            typeof(OpenIdConnectMiddleware).FullName,
            typeof(string).FullName, schemeName,
            "v1");
        var dataFormat = new CachedPropertiesDataFormat(distributedCache, dataProtector);
        ///
        /// Azure AD Configuration
        /// 
        var clientId = Configuration["AzureActiveDirectory:ClientId"];
        var tenantId = Configuration["AzureActiveDirectory:TenantId"];
        Redirect = Configuration["AzureActiveDirectory:TenantId"];
        app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
        {
            AuthenticationScheme = schemeName,
            DisplayName = "Azure-AD",
            SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
            ClientId = clientId,
            Authority = $"https://login.microsoftonline.com/{tenantId}",
            ResponseType = OpenIdConnectResponseType.IdToken,
            StateDataFormat = dataFormat,
        });
        app.UseIdentity();
        app.UseStaticFiles();
        app.UseMvcWithDefaultRoute();

这是登录。

[HttpGet]
public async Task<IActionResult> ExternalLogin(string provider, string returnUrl)
{
    var context = this.HttpContext.Authentication;
    List<AuthenticationDescription> schemes =  context.GetAuthenticationSchemes().ToList();
    returnUrl = Url.Action("ExternalLoginCallback", new { returnUrl = returnUrl });
    // start challenge and roundtrip the return URL
    var props = new AuthenticationProperties
    {
        RedirectUri = returnUrl,
        Items = { { "scheme", provider } }
    };
    //await HttpContext.Authentication.ChallengeAsync(provider, props);
    return new ChallengeResult(provider, props);         
}

在我看来,我们不应该直接将用户名/密码直接从其他IDP传递到Azure AD,以作为安全实现。,仅在本地客户端可用。我建议您保持正常方式,不要混合它们。

最新更新