Dự án Asp.Net MVC5 mới tạo ra một vòng lặp vô hạn để đăng nhập trang


77

Tôi đang tạo một projet hoàn toàn mới với Visual Studio 2013, tôi chọn Asp.Net MVC và framework 4.5.1 Dự án được tạo, sau đó, tôi không làm gì khác hơn là F5 để khởi động trang web mặc định. Thật không may, nó tạo ra một chuyển hướng đến trang đăng nhập cũng đang chuyển hướng đến trang đăng nhập. Đây là phiên bản ngắn của url mà tôi có trong trình duyệt:

http://localhost:5285/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525

Tôi không có bất kỳ lỗi nào trong Trình xem sự kiện. Nhưng trong màn hình tôi thấy:

"Lỗi HTTP 404.15 - Không tìm thấy Mô-đun lọc yêu cầu được định cấu hình để từ chối yêu cầu trong đó chuỗi truy vấn quá dài."

Trang web đang chạy với cài đặt mặc định trong IIS Express. Làm cách nào để khắc phục sự cố này? Tôi đoán có điều gì đó không ổn với Visual Studio 2013 của mình?

Biên tập

Nó hoạt động nếu tôi tạo một trang web hoàn toàn mới và tôi lưu trữ nó trong IIS. Nhưng nếu tôi tạo một trang web mới (mà không sửa đổi bất kỳ thứ gì) và chỉ nhấn play (khởi động IIS Express theo mặc định) thì không.

Chỉnh sửa 2

Tôi đã xóa mọi trang web trong Documents \ IISExpress \ config \ applicationhost.config. Tôi đã biên dịch lại mọi thứ và nó tạo ra mục nhập này:

    <siteDefaults>
        <logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
        <traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
    </siteDefaults>
    <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Tôi vẫn gặp lỗi với IIS Express, không phải với IIS.

Câu trả lời:


66

Đánh dấu dự án trong Visual Studio

Mở bảng 'Thuộc tính' ở bên phải (hoặc nhấn F4)

Đặt 'Xác thực Windows' thành 'Đã tắt'

Đặt 'Xác thực ẩn danh' thành 'Đã bật'


4
chìa khóa là Đặt 'Xác thực ẩn danh' thành 'Đã bật'
thẳng thắn

16
Nhưng điều gì sẽ xảy ra nếu tôi thực sự muốn bật Xác thực Windows và tắt Xác thực Ẩn danh. Điều này là do tôi muốn lấy thông tin đăng nhập Windows của người dùng cho một ứng dụng mạng nội bộ.
David

Xin chào Rob, đây không phải là thuộc tính của một dự án Visual Studio. Tuy nhiên, chúng là cài đặt trong Trình quản lý IIS. Đặt chúng đã khắc phục sự cố cho tôi.
Jon Eldridge

Đã giải quyết vấn đề của tôi !! Cảm ơn!!
wadefanyaoxia

37

Bạn đang thiếu [AllowAnonymous]thuộc tính về hành động đăng nhập.

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    // code....
}

Khả năng thứ hai , chỉ dành riêng cho IIS Express: đó là, nếu bạn đã tạo cùng một WebApplication1dự án mặc định nhiều lần, chơi với các cài đặt xác thực khác nhau, IIS Express sẽ lưu trữ các cài đặt xác thực bổ sung trong tệp cấu hình của nó. Cái gì đó như:

    <location path="WebApplication1">
        <system.webServer>
            <security>
                <authentication>
                    <windowsAuthentication enabled="true" />
                    <anonymousAuthentication enabled="false" />
                </authentication>
            </security>
        </system.webServer>
    </location>
</configuration>

Các cấu hình nằm trong thư mục Documents của người dùng Documents\IISExpress\config\và bạn nên tìm:

applicationhost.config

Sau đó, chỉ cần xóa nút xml <location path="WebApplication1">được đề cập ở trên.


Cập nhật cho VS 2015+

Nếu bạn đang sử dụng Visual Studio 2015 trở lên, hãy kiểm tra đường dẫn này để biết tệp cấu hình: $(solutionDir)\.vs\config\applicationhost.config

Mỗi giải pháp sẽ có tệp cấu hình riêng.


Không. Nó ở đó theo mặc định và tôi không thay đổi bất cứ điều gì.
Patrick Desjardins

Hãy để tôi thử nó cho tôi vài phút
Patrick Desjardins

Tôi đã cập nhật câu hỏi. Xóa nút xml không khắc phục được sự cố.
Patrick Desjardins

1
Không phải sitephần, đó là locationphần riêng biệt ở cuối tệp. Và tìm kiếm tên ứng dụng của bạn.
Nenad

1
@Nenad Tôi vừa dành hàng giờ để khắc phục sự cố này. Tôi có linh cảm rằng câu trả lời của bạn là giải pháp của tôi, nhưng applicationhost.configtệp trong Documentsthư mục không tham chiếu đến dự án của tôi, vì vậy tôi đã từ bỏ cách tiếp cận đó — một quyết định, hóa ra là quá sớm. Thật vậy, câu trả lời của bạn là đúng, tuy nhiên, vị trí tệp đã thay đổi trong các phiên bản mới hơn của Visual Studio (2015+). Tệp hiện nằm trong thư mục gốc của giải pháp. Tôi đã cập nhật câu trả lời của bạn để bao gồm thông tin mới này. Cảm ơn bạn.
Lopsided

36

Sự cố này là do chế độ xác thực được chọn (theo mặc định) bởi Mẫu MVC 5, kích hoạt chuyển hướng Kiểu ReturnUrl có thể dẫn đến một vòng lặp vô hạn nếu không được định cấu hình đúng.

Để tắt tính năng khám phá khởi động OWIN, hãy thêm khóa này vào tệp webconfig của bạn.

<add key="owin:AutomaticAppStartup" value="false"/>

6
Chà, điều này đã giải quyết vấn đề cho tôi. Làm thế nào trên Trái đất mà có người tìm thấy thứ này? Cảm ơn amigo.
thi

Điều này cũng giải quyết được vấn đề của tôi! Làm thế nào trên Trái đất ...? Có ai muốn chia sẻ nó là gì không? CHỈNH SỬA: tốt, nó không còn chuyển hướng đến trang Đăng nhập và thay vào đó hiển thị lỗi 401?
Luke Vo

1
nếu tôi cần khởi động lại thì sao? (Infact tôi đã thiết lập một startup.cs)
Jogi

1
Bây giờ tôi có thể đăng nhập, nhưng nó khiến tôi gặp sự cố khi đăng xuất. Nó không phải là câu trả lời tối ưu cho tôi. Dù sao cũng cảm ơn bạn.
Tiến sĩ MAF

1
cái này có trong cài đặt ứng dụng không?
Rez.Net

7

Tôi đã phải xóa ( Liên kết nguồn ):

<authorization>
  <deny users="?" />
</authorization>

Sau khi nâng cấp với lệnh update-gói NuGet đó là vấn đề của tôi ... lạ rằng bản cập nhật thêm những dòng để web.config
Dragouf

Điều đó rất thú vị vì đối với tôi là theo cách khác. Tôi đã phải thêm điều này để làm cho nó hoạt động!
Exel Gamboa

7

Tôi biết tôi có thể đến muộn, và điều này không trực tiếp cho câu hỏi của OP. Nhưng nếu có ai đó trong tương lai đến đây, hãy kiểm tra thêm một lần nữa về AllowAnonymousAuthorizethuộc tính đó là bạn phải kiểm tra tất cả các hành động con .

Ví dụ: tôi có Bố cục của mình (mà trang Đăng nhập cũng sử dụng) gọi 2 hành động con cho breadcrumbs và sidebar và chúng không có AllowAnonymousthuộc tính (Bộ điều khiển cóAuthorize thuộc tính).

Hy vọng điều này giúp đỡ.


Tôi đã mất hai giờ để tìm câu trả lời của bạn và sau đó 2 phút để tìm hành động con bị ẩn trong bố cục của chúng tôi bị thiếu thuộc tính AllowAnonymous.
nemesv

@nemesv Rất vui vì tôi có thể giúp được :) Cảm ơn vì tiền thưởng!
Luke Vo

Tôi cần thêm ViewModel và Controller cho bố cục Điều hướng của mình. Không có [AllowAnonymous] trên hành động NavBarController Index () đã gây ra một vòng lặp vô hạn của hành động Login ().
Smitty-Werben-Jager-Manjenson

5

Trong IIS, Chọn trang web của bạn và kiểm tra Xác thực, Nếu bạn đang sử dụng Xác thực Mẫu thì -

  1. Đặt 'Xác thực Windows' thành 'Đã tắt',
  2. Đặt 'Xác thực ẩn danh' thành 'Đã bật'
  3. Đặt 'Xác thực Mẫu' thành 'Đã bật'

Tôi nhận được lỗi này sau khi nhóm của chúng tôi thực hiện một số thay đổi đối với giải pháp. Câu trả lời này đã giúp tôi rất nhiều. Cảm ơn.
Tiến sĩ MAF

3

Mẫu ASP.Net MVC 5 thêm Microsoft.Owin và các thư viện liên quan vào dự án. Vì cơ sở hạ tầng Owin không yêu cầu Xác thực Mẫu, nên mẫu cũng giới thiệu khóa sau trong web.config.

<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
  </modules>
</system.webServer>

Sự hiện diện của khóa này có thể là một lý do cho việc quay lại trang Đăng nhập không mong muốn. Nhận xét nó có thể giúp khắc phục sự cố cho một số người.


2

Tôi gặp phải vấn đề tương tự vì dự án MVC của tôi được định cấu hình cho .Net 4.5 nhưng tôi đang sử dụng .Net 4.0 làm nhóm ứng dụng của mình trong IIS. Đã chuyển nó sang nhóm ứng dụng .Net 4.5 và sự cố đã được khắc phục. Tôi mong điều này giúp được người nào khác!


2

TL: DR? Không gọi một API web được bảo vệ (bất kỳ API web nào yêu cầu Ủy quyền) từ một trang ủy quyền như ~ / Account / Login (tự nó KHÔNG làm việc này.). Nếu bạn làm vậy, bạn sẽ tham gia vào một vòng lặp chuyển hướng vô hạn ở phía máy chủ.

Nguyên nhân

Tôi thấy rằng thủ phạm, gián tiếp, AccountController::Authorizevà thực tế AccountControllerđược trang trí bằng [Authorize].

Nguyên nhân gốc rễ là Sammy () được gọi từ HomeViewModel () (Dòng 6 của home.viewmodel.js), đang truy cập "API web được bảo vệ". Điều này đã được thực hiện cho / Tài khoản / Đăng nhập, dẫn đến / Tài khoản / Đăng nhập chuyển hướng đến chính nó.

Xác nhận

Bạn có thể xác nhận đây là nguyên nhân gây ra sự cố của mình thông qua một số phương pháp:

  1. Trang trí AccountController::Authorizevới[AllowAnonymous]
  2. Nhận xét các lệnh gọi Sammy () được thực hiện trong quá trình xây dựng mô hình xem.

Giải pháp

Giải pháp là chỉ tạo gói ứng dụng (còn gọi là "~ / Bundles / app") cho các chế độ xem đã yêu cầu ủy quyền. Theo hiểu biết của tôi / Tài khoản / lượt xem là các chế độ xem dựa trên MVC cổ điển và không phải là một phần của mô hình dữ liệu / chế độ xem của ứng dụng, nhưng tôi đã chuyển nhầm Scripts.Render(@"~/bundles/app")lệnh gọi gói thành _Layout.cshtml (khiến các lệnh gọi API web được bảo vệ được thực hiện cho tất cả các lượt xem MVC , bao gồm / Tài khoản /.)


2

trong trường hợp của tôi: trong _layout.cshtml của tôi, tôi sử dụng Html. Hành động để gọi Hành động từ Bộ điều khiển cấp quyền: ví dụ: Html.Action ("Đếm", "Sản phẩm") -> lỗi vòng lặp

sửa lỗi: trang trí bằng thuộc tính [AllowAnonymous] trong Hành động đó (hoặc xóa các trình trợ giúp Html này khỏi _layout)


2

Tôi vừa giải quyết vấn đề này trong nhiều giờ liền.

Đối với tôi, nó nằm trong tệp Startup.Auth.cs.

Mã này, khi được nhận xét ra, đã dừng vòng lặp chuyển hướng.

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });

Trong trường hợp của tôi, tôi chỉ phải nhận xét "LoginPath = new PathString (" / Tài khoản / Đăng nhập ")"
Ryan Dunphy

2
những gì bạn đang đề xuất là chỉ xóa toàn bộ chức năng chuyển hướng đăng nhập. Điều này dường như không phải là một giải pháp hợp lệ đối với tôi.
Lopsided

1

Xin lưu ý rằng đây là lời khuyên có khả năng gây hại, hiếm khi là ý kiến ​​hay nếu bạn sửa đổi trực tiếp tệp cấu hình máy chủ ứng dụng, thường có các công cụ sẽ thực hiện việc này cho bạn một cách an toàn (ví dụ: từ trong Visual Studio.) Trước khi tiếp tục, hãy đảm bảo để tạo bản sao lưu của tệp này trong trường hợp IIS Express của bạn bị chuyển vào thùng rác.

Để khắc phục sự cố này, tôi đã lấy tệp cấu hình IIS mặc định ở đây:

C:\Windows\System32\inetsrv\config\applicationHost.config

Tới tài liệu của tôi

%userprofile%\documents\iisexpress\config\applicationhost.config

Va no đa hoạt động.

Điều này là do tôi đã đặt một số Xác thực Windows chứ không phải tài khoản ẩn danh.


này không làm việc cho tôi chỉ iisexpress gây ra sụp đổ khi khởi động
ozhug

1

Đảm bảo rằng bạn không có hành động nào trong quy trình có thuộc tính ủy quyền. Trong trường hợp của tôi, bố cục của tôi có bộ điều khiển menu điều hướng bị thiếu thuộc tính allowAnonymous.


1

Tôi đã giải quyết được vấn đề tương tự nhờ câu trả lời được chấp nhận này: Vòng lặp chuyển hướng đăng nhập ASP.NET khi người dùng không có vai trò .

Có thể bộ điều khiển chứa hành động Đăng nhập được trang trí bằng AuthorizeAttribute(thậm chí là tùy chỉnh) trong khi hành động đăng nhập không được trang trí bằng AllowAnonymousthuộc tính. Xóa AuthorizeAttributekhỏi bộ điều khiển và thêm AllowAnonymousvào hành động đăng nhập có thể là một giải pháp khả thi.


Nó có thể mở rộng các Hành động khác mà trước đó đã được bảo mật.
Mariusz,

1

Những câu trả lời này ít nhiều là những mảnh ghép của cùng một câu đố; Tôi sẽ cố gắng đặt mọi thứ ở một nơi. Sự cố mà OP mô tả đã xảy ra với ứng dụng của tôi ngay khi tôi triển khai đường ống OWIN và Nhận dạng AspNET.

Vì vậy, chúng ta hãy xem cách khắc phục nó ...

  1. Khởi động OWIN

Tôi đoán bạn cần nó, bởi vì nếu bạn không, thì bạn không cần xác thực, và tôi đoán bạn cũng vậy. Ngoại trừ việc bạn đang sử dụng một số xác thực kiểu cũ và tôi đoán là bạn không. Vì vậy, đừng xóa thuộc tính khởi động OWIN ...

[assembly: OwinStartupAttribute(typeof(YourApp.Probably_App_Start.SomethingLikeAuthConfig))]

... hoặc dòng cấu hình ...

<add key="owin:AppStartup" value="YourApp.Probably_App_Start.SomethingLikeAuthConfig" />
  1. Hạn chế truy cập trên bộ điều khiển

Bây giờ chúng tôi đã giải quyết vấn đề này, bạn cần xác thực. Điều này có nghĩa là mỗi bộ điều khiển của bạn cần [Authorize]thuộc tính hoặc bạn có thể làm như vậy với tất cả bộ điều khiển ở một nơi bằng cách đăng ký toàn bộ thứ (ví dụ: trong RegisterGlobalFilters(), thêm dòng filter.Add(new AuthorizeAttribute())). Trong trường hợp trước đây (khi bảo mật từng bộ điều khiển riêng biệt), hãy bỏ qua phần này, chỉ chuyển sang phần tiếp theo. Trong trường hợp sau, tất cả các bộ điều khiển của bạn sẽ được bảo mật trước các truy cập trái phép, vì vậy bạn cần một điểm vào cho ủy quyền đó - Login()hành động không được bảo vệ . Chỉ cần thêm...

[AllowAnonymous]

... và bạn nên tốt.

  1. Cấu hình cookie OWIN

Khi người dùng của bạn đăng nhập, trình duyệt của họ sẽ lưu trữ cookie được mã hóa (hy vọng!) Để đơn giản hóa mọi thứ cho hệ thống. Vì vậy, bạn cần cookie - đừng xóa dòng có nội dung UseCookieAuthentication.

  1. Những gì bạn thực sự phải làm là tắt cơ chế xác thực tích hợp IIS cho ứng dụng web của bạn. Điều này có nghĩa là tắt Windows Authentication(Đã tắt ) và cho phép bất kỳ người dùng nào tham gia, ít nhất là miễn là IIS Express hiện có liên quan, bằng cách thiết lập Anonymous Authentication(Đã bật).

Khi bạn khởi động trang web của mình, thao tác này sẽ lần lượt sao chép các cài đặt này vào cấu hình IIS Express ( applicationhost.config) và ở đó bạn sẽ thấy hai dòng sau:

<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="true" />
  1. Bạn có thể có cấu hình ủy quyền trong web.config của bạn deny users="?". Nó có nghĩa là hệ thống con ủy quyền được hướng dẫn để ngăn người dùng ẩn danh xâm nhập. Với OWIN, điều này vẫn hoạt động như thiết kế. Bạn phải xóa điều này hoặc làm cho người dùng ẩn danh của bạn có thể truy cập trang Đăng nhập bằng cách sử dụng một cái gì đó như ...

    <location path="Account/Login"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>

HTH


0

Tôi đã gặp sự cố tương tự trong đó nó ở trong vòng lặp vô hạn khi gọi lại trang web cục bộ. Nó chỉ ra rằng khi gỡ lỗi cục bộ, nó đã chuyển hướng các cổng. Tôi đã cập nhật số cổng trong màn hình thuộc tính dự án nhưng vẫn để nguyên định nghĩa Azure trong dự án đám mây và mọi thứ bắt đầu hoạt động như mong đợi.


0

Tôi đã gặp vấn đề tương tự với dự án Asp.Net MVC 4 của mình. Tôi đã giải quyết nó bằng cách truy cập Startup.cs và bình luận dòng cho ConfigureAuth (ứng dụng)

    public void Configuration(IAppBuilder app)
    {
        //ConfigureAuth(app);
    }

Tôi cũng đảm bảo rằng tôi đã bật Xác thực Windows trong IIS cho dự án của mình và tất cả các tùy chọn xác thực khác đã bị tắt.


0

Đối với tôi, điều này hóa ra là do LoginViewModel của tôi có chứa các tham chiếu đến các tệp tài nguyên dịch, dường như được bảo vệ bằng xác thực. Tôi đã xóa các tham chiếu đó và vấn đề đã được giải quyết.


0

Đối với tôi, việc loại bỏ khối sau đã khắc phục nó:

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

Giả định

<authentication mode="None" />

0

trong trường hợp của tôi, đó là một vấn đề rất có dây, tôi đã trang trí bộ điều khiển nhà bằng vai trò không tồn tại. vì vậy nó gây ra một vòng lặp chuyển hướng.


-1

Đi tới tệp applicationhost.config của bạn và đặt nặc danhauthentication = "true"

<authentication>

            <anonymousAuthentication enabled="true" userName="" />
            <windowsAuthentication enabled="true">
                <providers>
                    <add value="Negotiate" />
                    <add value="NTLM" />
                </providers>
            </windowsAuthentication>

        </authentication>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.