asp.net-core - AspNetCore 使用OpenIdConnectAuthentication

标签 asp.net-core azure-ad-b2c

我正在使用 Azure AD B2C 在 AspNetCore RC2 MVC 应用程序中进行身份验证,这部分有效,因为当我导航到需要身份验证的操作时,我会相应地重定向到 B2C 登录页面。当我成功登录时,我会正确重定向到我的应用程序页面(并且我可以看到查询参数中相应提供的 id_token 字段)。不幸的是,管道身份验证中间件似乎无法正确处理重定向查询参数,因为它立即将我重定向到登录页面。谁能给点建议吗?

我使用的代码如下:

public static void UseOAuth(this IApplicationBuilder app)
{
    // By default, all middleware are passive/not automatic. Making cookie middleware automatic so that it acts on all the messages. 
    app.UseCookieAuthentication( new CookieAuthenticationOptions{ AutomaticAuthenticate = true, CookieSecure = CookieSecureOption.Never });

    app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions { 
        ClientId = B2CAuthentication.ClientId,
        ResponseType = OpenIdConnectResponseTypes.IdToken,
        Authority = string.Format(CultureInfo.InvariantCulture, B2CAuthentication.AadInstance, B2CAuthentication.PortalTenant, string.Empty, string.Empty),
        AuthenticationScheme = "Cookies",
        Events = new OpenIdConnectEvents
        {
            OnAuthenticationFailed = OnAuthenticationFailed,
            OnRedirectToIdentityProvider = OnRedirectToIdentityProvider,
            OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,
            OnTokenResponseReceived = OnTokenResponseReceived,
            OnTokenValidated = OnTokenValidated,
            OnTicketReceived = OnTicketReceived,
            OnMessageReceived = OnMessageReceived,
            OnRedirectToIdentityProviderForSignOut = OnRedirectToIdentityProviderForSignOut,
            OnRemoteFailure = OnRemoteFailure,
            OnUserInformationReceived = OnUserInformationReceived
        },
        // The PolicyConfigurationManager takes care of getting the correct Azure AD authentication 
        // endpoints from the OpenID Connect metadata endpoint.  It is included in the PolicyAuthHelpers folder. 
        ConfigurationManager = new PolicyConfigurationManager(
            string.Format(CultureInfo.InvariantCulture, B2CAuthentication.AadInstance, B2CAuthentication.PortalTenant, "/v2.0", "/" + OpenIdProviderMetadataNames.Discovery),
            new string[] { B2CAuthentication.ResetPolicy, B2CAuthentication.CommonPolicy, B2CAuthentication.SignInPolicy })

    });
}

private static Task OnUserInformationReceived(UserInformationReceivedContext arg)
{
    ...Never called...
}

private static Task OnRemoteFailure(FailureContext arg)
{
    ...Never called...
}

private static Task OnRedirectToIdentityProviderForSignOut(RedirectContext arg)
{
    ...Never called...
}

private static Task OnMessageReceived(MessageReceivedContext arg)
{
    ...Never called...
}

private static Task OnTicketReceived(TicketReceivedContext arg)
{
    ...Never called...
}

private static Task OnTokenValidated(TokenValidatedContext arg)
{
    ...Never called...
}

private static Task OnTokenResponseReceived(TokenResponseReceivedContext arg)
{
    ...Never called...
}

private static Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext arg)
{
    ...Never called...
}

private static async Task OnRedirectToIdentityProvider(RedirectContext context)
{
    PolicyConfigurationManager mgr = (PolicyConfigurationManager)context.Options.ConfigurationManager;
    if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
    {
        OpenIdConnectConfiguration config = await mgr.GetConfigurationByPolicyAsync(CancellationToken.None, B2CAuthentication.CommonPolicy);
        context.ProtocolMessage.IssuerAddress = config.EndSessionEndpoint;
    }
    else
    {
        OpenIdConnectConfiguration config = await mgr.GetConfigurationByPolicyAsync(CancellationToken.None, B2CAuthentication.CommonPolicy);
        context.ProtocolMessage.IssuerAddress = config.AuthorizationEndpoint;
        context.ProtocolMessage.RedirectUri = "http://localhost:8080/Portal/";
        context.ProtocolMessage.ResponseType = OpenIdConnectResponseTypes.IdToken;
        context.ProtocolMessage.ResponseMode = OpenIdConnectResponseModes.Query;
    }
}

private static Task OnAuthenticationFailed(AuthenticationFailedContext context)
{
    context.HandleResponse();
    context.Response.Redirect("/Home/Error?message=" + context.Exception.Message);
    return Task.FromResult(0);
}

最佳答案

我通过执行以下操作成功地使其正常工作:

从根本上来说,我认为 CallbackPath 的使用、对 AuthenticationScheme 的更改以及对 FormPost 的 ResponseMode 的更改都有助于修复。

public static void UseOAuth(this IApplicationBuilder app)
{
    // By default, all middleware are passive/not automatic. Making cookie middleware automatic so that it acts on all the messages. 
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AutomaticAuthenticate = true,
        CookieName = "MyCookieName",
        CookieSecure = CookieSecureOption.Never,
        AuthenticationScheme =  "Cookies"
    });

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();

    app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions { 
        AutomaticAuthenticate = true,
        Authority = string.Format(CultureInfo.InvariantCulture, B2CAuthentication.AadInstance, B2CAuthentication.PortalTenant, string.Empty, string.Empty),
        ClientId = B2CAuthentication.ClientId,
        ResponseType = OpenIdConnectResponseTypes.IdToken,
        AuthenticationScheme = "oidc",
        ResponseMode = OpenIdConnectResponseModes.FormPost,
        CallbackPath = "/",
        Scope = { "openid" },
        Events = new OpenIdConnectEvents
        {
            OnAuthenticationFailed = OnAuthenticationFailed,
            OnRedirectToIdentityProvider = OnRedirectToIdentityProvider,
            OnTokenValidated = OnTokenValidated,
            OnRemoteFailure = OnRemoteFailure
        },
        // The PolicyConfigurationManager takes care of getting the correct Azure AD authentication 
        // endpoints from the OpenID Connect metadata endpoint.  It is included in the PolicyAuthHelpers folder. 
        ConfigurationManager = new PolicyConfigurationManager(
            string.Format(CultureInfo.InvariantCulture, B2CAuthentication.AadInstance, B2CAuthentication.PortalTenant, "/v2.0", "/" + OpenIdProviderMetadataNames.Discovery),
            new string[] { B2CAuthentication.ResetPolicy, B2CAuthentication.CommonPolicy, B2CAuthentication.SignInPolicy })

    });
}

关于asp.net-core - AspNetCore 使用OpenIdConnectAuthentication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37388336/

相关文章:

debugging - AspNetCore 应用程序在生产中泄漏线程 - 如何调试?

asp.net - ASP.NET 5 类库(包)中的 .NET Platform 5.4 是什么?

c# - ASP.Net Core 应用程序可在 visual studio 中运行,但不适用于 dotnet run

Azure AD B2C 密码过期

azure-active-directory - 如何获取 Azure AD B2C 自定义策略中开放/目录扩展的值?

c# - 名为 : 'Admin' was not found 的 AuthorizationPolicy

c# - 尝试激活 'Microsoft.AspNetCore.Identity.SignInManager` 时无法解析类型 'xxxxx.LoginModel' 的服务

azure - 在同一reactjs应用程序和aspnet core web api中混合Azure AD和Azure AD B2C身份验证

c# - Microsoft Graph API 测试 - 代表用户获取访问权限

ios - 将 Swift 中的 Azure B2C 与 native 登录屏幕集成