简体   繁体   English

Azure AD B2C-不重定向到登录/注册页面(login.microsoftonline.com…)

[英]Azure AD B2C - Not redirecting to SignIn/SignUp Page(login.microsoftonline.com…)

I have a project that I have started building, and want to make us of Azure AD B2C - I have followed some tutorials and tested by creating a new MVC app from scratch and I got it working, however, when I try implement it into my existing project, then it does not redirect to the SignIn/SignUp page(this is the login.microsoftonline.com...) url. 我有一个已经开始构建的项目,并且想让我们使用Azure AD B2C-我已经按照一些教程进行了测试,并通过从头开始创建一个新的MVC应用进行了测试,但是当我尝试将其实现到我的应用中时,它就开始运行了。现有项目,则它不会重定向到SignIn / SignUp页面(这是login.microsoftonline.com ...)URL。 I know my code works to redirect to this url as it worked on the new project I created to test, so just not sure why it wont on my existing project. 我知道我的代码可以重定向到该URL,因为它可以在我创建的要测试的新项目中使用,所以只是不确定为什么它不会在我现有的项目中使用。

This is in my Web.Config: 这是在我的Web.Config中:

<add key="ida:Tenant" value="Name.onmicrosoft.com" />
<add key="ida:ClientId" value="GUID" />
<add key="ida:ClientSecret" value="Secret" />
<add key="ida:AadInstance" value="https://login.microsoftonline.com/tfp/{0}/{1}/v2.0/.well-known/openid-configuration" />
<add key="ida:RedirectUri" value="https://localhost:44382/" />
<add key="ida:SignUpSignInPolicyId" value="B2C_1_SiUpIn" />
<add key="ida:EditProfilePolicyId" value="B2C_1_SiPe" />
<add key="ida:ResetPasswordPolicyId" value="B2C_1_SSPR" />

ActionLink: ActionLink:

@Html.ActionLink("Sign up / Sign in", "SignUpSignIn", "Account", routeValues: null, htmlAttributes: new { id = "signUpSignInLink" })

This is the SignUpSignIn function I am calling: 这是我正在调用的SignUpSignIn函数:

[AllowAnonymous]
        public void SignUpSignIn()
        {
            // Use the default policy to process the sign up / sign in flow
            if (!Request.IsAuthenticated)
            {
                HttpContext.GetOwinContext().Authentication.Challenge();
                return;
            }

            Response.Redirect("/");
        }

Below is the code from my Startup: 下面是我的启动代码:

public partial class Startup
    {
        // App config settings
        public static string ClientId = ConfigurationManager.AppSettings["ida:ClientId"];
        public static string ClientSecret = ConfigurationManager.AppSettings["ida:ClientSecret"];
        public static string AadInstance = ConfigurationManager.AppSettings["ida:AadInstance"];
        public static string Tenant = ConfigurationManager.AppSettings["ida:Tenant"];
        public static string RedirectUri = ConfigurationManager.AppSettings["ida:RedirectUri"];
        public static string ServiceUrl = ConfigurationManager.AppSettings["api:TaskServiceUrl"];

        // B2C policy identifiers
        public static string SignUpSignInPolicyId = ConfigurationManager.AppSettings["ida:SignUpSignInPolicyId"];
        public static string EditProfilePolicyId = ConfigurationManager.AppSettings["ida:EditProfilePolicyId"];
        public static string ResetPasswordPolicyId = ConfigurationManager.AppSettings["ida:ResetPasswordPolicyId"];

        public static string DefaultPolicy = SignUpSignInPolicyId;

        // API Scopes
        public static string ApiIdentifier = ConfigurationManager.AppSettings["api:ApiIdentifier"];
        public static string ReadTasksScope = ApiIdentifier + ConfigurationManager.AppSettings["api:ReadScope"];
        public static string WriteTasksScope = ApiIdentifier + ConfigurationManager.AppSettings["api:WriteScope"];
        public static string[] Scopes = new string[] { ReadTasksScope, WriteTasksScope };

        // OWIN auth middleware constants
        public const string ObjectIdElement = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier";

        // Authorities
        public static string Authority = String.Format(AadInstance, Tenant, DefaultPolicy);

        /*
        * Configure the OWIN middleware 
        */
        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions());

            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    // Generate the metadata address using the tenant and policy information
                    MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),

                    // These are standard OpenID Connect parameters, with values pulled from web.config
                    ClientId = ClientId,
                    RedirectUri = RedirectUri,
                    PostLogoutRedirectUri = RedirectUri,

                    // Specify the callbacks for each type of notifications
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        RedirectToIdentityProvider = OnRedirectToIdentityProvider,
                        AuthorizationCodeReceived = OnAuthorizationCodeReceived,
                        AuthenticationFailed = OnAuthenticationFailed,
                    },

                    // Specify the claims to validate
                    TokenValidationParameters = new TokenValidationParameters
                    {
                        NameClaimType = "name"
                    },

                    // Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
                    Scope = $"openid profile offline_access {ReadTasksScope} {WriteTasksScope}"
                }
            );
        }

        /*
         *  On each call to Azure AD B2C, check if a policy (e.g. the profile edit or password reset policy) has been specified in the OWIN context.
         *  If so, use that policy when making the call. Also, don't request a code (since it won't be needed).
         */
        private Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
        {
            var policy = notification.OwinContext.Get<string>("Policy");

            if (!string.IsNullOrEmpty(policy) && !policy.Equals(DefaultPolicy))
            {
                notification.ProtocolMessage.Scope = OpenIdConnectScopes.OpenId;
                notification.ProtocolMessage.ResponseType = OpenIdConnectResponseTypes.IdToken;
                notification.ProtocolMessage.IssuerAddress = notification.ProtocolMessage.IssuerAddress.ToLower().Replace(DefaultPolicy.ToLower(), policy.ToLower());
            }

            return Task.FromResult(0);
        }

        /*
         * Catch any failures received by the authentication middleware and handle appropriately
         */
        private Task OnAuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
        {
            notification.HandleResponse();

            // Handle the error code that Azure AD B2C throws when trying to reset a password from the login page 
            // because password reset is not supported by a "sign-up or sign-in policy"
            if (notification.ProtocolMessage.ErrorDescription != null && notification.ProtocolMessage.ErrorDescription.Contains("AADB2C90118"))
            {
                // If the user clicked the reset password link, redirect to the reset password route
                notification.Response.Redirect("/Account/ResetPassword");
            }
            else if (notification.Exception.Message == "access_denied")
            {
                notification.Response.Redirect("/");
            }
            else
            {
                notification.Response.Redirect("/Home/Error?message=" + notification.Exception.Message);
            }

            return Task.FromResult(0);
        }


        /*
         * Callback function when an authorization code is received 
         */
        private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
        {
            // Extract the code from the response notification
            var code = notification.Code;

            string signedInUserID = notification.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
            TokenCache userTokenCache = new MSALSessionCache(signedInUserID, notification.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase).GetMsalCacheInstance();
            ConfidentialClientApplication cca = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, new ClientCredential(ClientSecret), userTokenCache, null);
            try
            {
                AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, Scopes);
            }
            catch (Exception ex)
            {
                //TODO: Handle
                throw;
            }
        }
    }

When I click on this ActionLink it hits the controller but then does not redirect, it just returns this URL: 当我单击此ActionLink时,它命中了控制器,但没有重定向,它仅返回以下URL:

https://localhost:44382/account/login?ReturnUrl=%2faccount%2fsignupsignin https:// localhost:44382 / account / login?ReturnUrl =%2faccount%2fsignupsignin

One thing I must mention, is I purchased a template that I am using - Dont know if this might have any effect - I am completely stumped and dont know what else I can look at.... 我必须提到的一件事是,我购买了我正在使用的模板-不知道这是否有效果-我完全迷住了,也不知道还能看到什么。

If you need anything that I have not posted, please let me know. 如果您需要我尚未发布的任何内容,请告诉我。

If anyone is able to assist me in the right direction, I would greatly appreciate it. 如果有人能够在正确的方向上帮助我,我将不胜感激。

Thanks! 谢谢!

So unfortunately I didnt find a specific solution to FIX the problem, as I could not pin point what exactly the problem was. 不幸的是,我找不到解决该问题的具体解决方案,因为我无法指出问题的确切原因。 However, I did sort out the problem by creating a brand new project and moved the items from the template I bought(which was an mvc project) to the newly created project. 但是,我确实通过创建一个全新的项目来解决问题,并将项目从我购买的模板(这是一个mvc项目)移到了新创建的项目中。 Pain in the butt as I needed to fix any bugs that occurred because of this, but it ended up working. 当我需要修复由于此而发生的所有错误时,屁股痛了,但最终还是起作用了。 There was obviously something in the bought template that was causing the issue. 显然,所购买的模板中有引起问题的原因。

So just to give some context - The template I bought had different frameworks you could use(MVC, PHP, Angular etc.), and I used the MVC project that contained the template and I just carried on building on that MVC project, so I am assuming there was something within that project that was causing the problem. 因此,仅提供一些背景信息-我购买的模板具有可以使用的不同框架(MVC,PHP,Angular等),并且我使用了包含模板的MVC项目,而我只是在该MVC项目上进行构建,所以我我假设该项目中存在导致问题的原因。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM