托管在 Azure 上的点网 mvc 应用程序突然一次又一次地重定向到登录页面,直到重新启动

Posted

技术标签:

【中文标题】托管在 Azure 上的点网 mvc 应用程序突然一次又一次地重定向到登录页面,直到重新启动【英文标题】:Dot net mvc application hosted on Azure suddenly redirects to login page again and again until restarted 【发布时间】:2021-11-26 15:00:56 【问题描述】:

我有 2 个Dot net mvc5 应用程序。 Azureas Webapps 上托管的前端和 API 应用程序。前端应用程序在代码中有Azure AD 身份验证设置。下面是来自startup.auth.cs 文件的代码

        var authority = string.Format("https://login.microsoftonline.com/0/v2.0", ConfigurationManager.AppSettings["TenantID"]);
        var idClient = ConfidentialClientApplicationBuilder.Create(appId)
            .WithRedirectUri(redirectUri)
            .WithClientSecret(appSecret)
            .WithAuthority(authority)
            .Build();

        var signedInUser = new ClaimsPrincipal(notification.AuthenticationTicket.Identity);
        var tokenStore = new SessionTokenStore(idClient.UserTokenCache, HttpContext.Current, signedInUser);

        try
        
            string[] scopes = graphScopes.Split(' ');

            var result = await idClient.AcquireTokenByAuthorizationCode(
                scopes, notification.Code).ExecuteAsync();

            var userDetails = await GraphHelper.GetUserDetailsAsync(result.AccessToken);

            var cachedUser = new CachedUser()
            
                DisplayName = userDetails.DisplayName,
                Email = string.IsNullOrEmpty(userDetails.Mail) ?
                userDetails.UserPrincipalName : userDetails.Mail,
                Avatar = string.Empty,
                AccessToken=result.AccessToken
            ;
            MethodHelper methodHelper = new MethodHelper();
            Dictionary<string, dynamic> authOutput = new Dictionary<string, dynamic>();
            authOutput =await methodHelper.AuthorizeUserByEmailID(cachedUser.Email);
            if (authOutput["Success"])
            
                AuthenticatedUser authenticatedUserDetails = authOutput["AuthenticatedUser"];
                if (authenticatedUserDetails != null&& authenticatedUserDetails.HasToolAccess)
                
                    AuthenticatedUser authenticatedUser = new AuthenticatedUser();
                    authenticatedUser = authOutput["AuthenticatedUser"];
                    cachedUser.UserID = authenticatedUser.UserId;
                    cachedUser.UserEmpId = authenticatedUser.UserEmpId;
                    cachedUser.DepartmentId = authenticatedUser.DepartmentId;
                    cachedUser.Department = authenticatedUser.Department;
                    tokenStore.SaveUserDetails(cachedUser);
                
                else
                
                
                    string message = "User Details return null";
                    notification.HandleResponse();
                    notification.Response.Redirect($"/Home/Error?message=message&debug=message");
                 else
            
                string message = authOutput["Exception"];
                notification.HandleResponse();
                notification.Response.Redirect($"/Home/Error?message=message&debug=message");
            

一旦应用程序成功接收到accesstoken,它就会调用 API 登录方法来获取用户的其他详细信息

authOutput =await methodHelper.AuthorizeUserByEmailID(cachedUser.Email);

执行此任务。 当登录系统的用户数量较少时,这完全可以正常工作。但是白天突然。应用程序停止工作,所有用户一次又一次地重定向到登录屏幕。 Until the Web App is restarted.

【问题讨论】:

【参考方案1】:

请检查您的 web.config 中的 Forms 标签,您可能已经提供了 ~/Login 网址。

我在配置文件中将 LoginUrl 添加为 ~/Login 并观察到同样的问题,我已将重定向修改为“~/Index”,它起作用了对我来说很好。

如果您有或创建新的 Action 来处理此路由,请将配置中的表单 LoginUrl 更改为现有的 Index 路由 "~/Index"

<authentication mode="Forms">
     <forms loginUrl="~/Account/Index" name="AuthClientUser"
           timeout="60" slidingExpiration="true" cookieless="UseCookies" 
           path="/">
     </forms>
</authentication>

并将以下内容添加到 web.config 中的 appSettings 部分

<add key="autoFormsAuthentication" value="false" />
<add key="enableSimpleMembership" value="false"/>

web.config 的授权部分拒绝所有匿名用户。

【讨论】:

感谢您的回复 Harshitha 这是我的 cookie 配置代码 app.UseCookieAuthentication(new CookieAuthenticationOptions CookieSecure = CookieSecureOption.Always, CookieManager = new SystemWebChunkingCookieManager(), AuthenticationType = "Cookies", LoginPath = new PathString( "/Account/SignIn"), LogoutPath = new PathString("/Account/SignOut"), ExpireTimeSpan = TimeSpan.FromHours(2), SlidingExpiration = true, ); 我尝试了解决方案,但很遗憾没有奏效 请检查 web.config 的授权部分,拒绝所有匿名用户。

以上是关于托管在 Azure 上的点网 mvc 应用程序突然一次又一次地重定向到登录页面,直到重新启动的主要内容,如果未能解决你的问题,请参考以下文章

Azure 上的身份服务器

基于 Matlab 的点网应用程序的托管服务提供商

从托管在 Azure 中的 Asp.net Core MVC Web App 获取“响应状态代码不表示成功:502(错误网关)”

静态托管 - Azure Azure CDN上的Azure Blob存储上的ReactJS应用程序

如何为托管在 Azure 上的 Web 应用程序和托管在窗口的 IIS 服务器上的 Web 应用程序使用相同的自定义域?

如何测试托管在 Azure Appservice 上的 SignalR 应用程序(负载 + 功能组合)