MVC RequireHttps butun sayt

Men individual kontrollerlarni himoya qilish uchun RequireHttpsAttribute-dan foydalanish haqidagi oldingi postlarni o'qib chiqdim:

ASP.NET MVC RequireHttps faqat ishlab chiqarishda

lekin buni butun saytga qo'llashning bir yo'li bormi? Xostim (discountasp.net) tufayli men "RequireSSL IIS" sozlamasidan foydalana olmayman.


person CodeGrue    schedule 19.07.2010    source manba
comment
Men maxsus qayta yo'naltirish modulini tavsiya qilaman, chunki u mvc hayotiy tsiklida tezroq ushlanadi va qayta yo'naltiriladi. Men buni ushbu maqoladan boshqacha qilgan bo'lardim [ alexwolfthoughts.com/ ] lekin u ba'zi imkoniyatlarni ko'rsatadi.   -  person christo8989    schedule 30.03.2016


Javoblar (9)


RequireHttpsAttribute ni global filtr sifatida ro'yxatdan o'tkazing.

global.asax saytida:

protected void Application_Start()
{
    GlobalFilters.Filters.Add(new RequireHttpsAttribute());

    //... other stuff
}
person hwiechers    schedule 10.04.2013
comment
Albatta, eng toza usul. - person Serj Sagan; 20.01.2014
comment
Men buni qilyapman va men qayta yo'naltirish davrini olaman. URLni qayta yozish men uchun ishladi. - person Raciel R.; 21.02.2014
comment
@RacielR. Ilgari men ham xuddi shunday muammoga duch kelganman, muammo xavfsizlik devorida ssl-ni qabul qilgan hosting hamkorida edi, lekin http orqali mening serverimga so'rov yuborishdan ko'ra... Xosting hamkoringiz ham shunday qilmayotganiga ishonch hosil qiling. - person Julian; 05.03.2014
comment
Rahmat @Julian, bu bizning holatimizda edi. - person Raciel R.; 05.03.2014
comment
Bu toza yechim, lekin u faqat MVC kontrollerlariga taalluqli emasmi? Agar siz har qanday URL, jumladan, statik manbalar yoki eski Web Forms aspx sahifalari uchun HTTPS-ni qo'llashni xohlasangiz nima bo'ladi? Aftidan, URLni qayta yozish usuli eng universal hisoblanadi. Hatto iisnode-da joylashgan Node.js ilovalari uchun ham ishlaydi (bilaman, chunki men buni qilyapman). - person dprothero; 21.05.2015
comment
Men buni IIS Express-dan foydalanganda ilovamga qo'lladim va u localhost ga yo'naltiradi. - person Joel McBeth; 23.09.2015
comment
Global filtrlarni (masalan, RequireHttps, Authorize va hokazo) ro'yxatdan o'tkazish uchun Global.asax-dagi RegisterGlobalFilters usulidan foydalanishni afzal ko'raman. Quyidagi javobimga misol qo'shdim. - person Dhanuka777; 18.04.2016
comment
RequireHttpsAttribute 301 (doimiy) o'rniga 302 (temp redir) yuboradi, bu SEOga zarar etkazishi mumkin. http://benjii.me/2015/10/redirect-to-https-asp-net-mvc/ - person Sam Rueby; 19.04.2016
comment
Maʼlumot uchun, agar kimdir kontrollerda yoki harakatda OverrideAuthorizationAttributedan foydalansa, u global filtrni oʻchirib tashlaydi. - person odyth; 12.07.2017
comment
@Sam.Rueby GlobalFilters.Filters.Add(yangi RequireHttpsAttribute(to'g'ri)); // doimiy uchun true bo'lsin - person Kris; 26.02.2018

Saytni HTTPS ga o'tishga majbur qilish uchun IIS URL Rewrite 2.0 dan foydalandim. web.config-dagi ushbu kod shunday qiladi:

  <system.webServer>
    <!-- This uses URL Rewrite 2.0 to force the entire site into SSL mode -->
    <rewrite xdt:Transform="Insert">
      <rules>
        <rule name="Force HTTPS" enabled="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="{HTTPS}" pattern="off" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
person CodeGrue    schedule 20.07.2010
comment
Menga o'xshab yillar o'tib topgan har bir kishi uchun bu vs2017 da men uchun xatolik tug'dirdi. Bunga o'xshash quyidagi javob ishladi: stackoverflow.com/a/47095/4180481 - person Ozan; 03.11.2017

Siz har doim global.asax saytida dastur darajasida chek qo'shishingiz mumkin

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (!HttpContext.Current.Request.IsSecureConnection)
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
                                 + HttpContext.Current.Request.RawUrl);
   }
}
person Todd Smith    schedule 19.07.2010

Bu javobni MVC 3 va undan yuqori uchun yangilash uchun App_start jildidagi Filterconfig.cs faylida quyidagilardan foydalaning.

        filters.Add(new RequireHttpsAttribute());

Shubhasiz, sizga amaldagi SSL sertifikatidan foydalanish uchun sozlangan serverlaringiz IIS kerak boʻladi, arzon sertifikatlarni bu yerda xarid qilish mumkin: https://www.namecheap.com/ Men oxirgi marta domenni sotib olganimda yiliga domen uchun $9 edi.

person Alex Stephens    schedule 25.10.2014
comment
Vaqt ajratib, qaytib kelganingiz va bu savolni dolzarb javob bilan yangilaganingiz uchun minnatdormiz - person James Wilson; 15.05.2015
comment
foydalanuvchilar http yozganda, RequireHttpsAttribute foydalanuvchilarni https ga yo'naltirishi kutilmoqdami yoki uning o'rniga 403 xatosi paydo bo'ladimi? - person usefulBee; 14.01.2016
comment
Qizig'i shundaki, RequireHttpsAttribute EMAS 302 (vaqtinchalik) qayta yo'naltirishni yuboradi. G'alati, chunki 301 doimiy qayta yo'naltirish bo'lib, bu erda ko'proq mos keladi. Qanday bo'lmasin, esda tutish kerakki, bu HTTP orqali saytga birinchi qo'ng'iroq bo'lib, u 302 ni HTTPS ga suradi va keyin ushbu seansdagi barcha keyingi qo'ng'iroqlar HTTPS protokoli doirasida bo'ladi. 302 ni yengishning bir yo'li bor, 1 yo'l Ben tomonidan taklif qilingan http://benjii.me/2015/10/redirect-to-https-asp-net-mvc/ - person Alex Stephens; 15.01.2016

FilterConfig.cs-da buni qo'llang:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
     // only if Debug is not enabled, do not require https for local development
     if (!HttpContext.Current.IsDebuggingEnabled)
          filters.Add(new RequireHttpsAttribute());

     //... any other filters
}

Bu sizning ilovangizni har bir sahifada https dan foydalanishga majbur qilishi kerak.

person joegreentea    schedule 15.04.2017
comment
IsDebuggingEnabled ni hali ko'rmagan edim! - person madannes; 03.12.2017

Bu RequireHttps dan foydalanmayapti, lekin menimcha, bu yaxshiroq yechim, chunki u qayta yoʻnaltirishni tezroq ushlaydi MVC hayot aylanishi.

public class RedirectModule : IHttpModule
{
    private HttpApplication _context;

    public void Init(HttpApplication context)
    {
        _context = context;
        _context.PostResolveRequestCache += HttpRedirect;
    }

    public void HttpRedirect(Object src, EventArgs args)
    {
        if (_context.Request.Url.Scheme == Uri.UriSchemeHttp)
        {
            //Redirect to https
            var scheme = Uri.UriSchemeHttps + "://";
            var authority = _context.Request.Url.Authority;
            var url = _context.Request.RawUrl;

            var redirectTo = scheme + authority + url;
            _context.Response.PermanentRedirect(redirectTo);
        }
    }

    public void Dispose() { }
}

G‘oya ushbu maqoladan kelib chiqqan.

Siz modulni Web.config yoki Global.asax ichida ro'yxatdan o'tkazishingiz mumkin. Men sizga web.cofig da ko'rsataman.

<system.webServer>
    <modules>
        <add name="ConfigModuleName" type="Your.Namespace.RedirectModule"/>
    </modules>
</system.webServer>
person christo8989    schedule 30.03.2016
comment
Application_BeginRequest PostResolveRequestCache da ro'yxatdan o'tgan voqea ishlovchisidan oldin chaqirilganga o'xshaydi. - person odyth; 12.07.2017

MVC 6 (ASP.NET Core 1.0) filtrlarni ro'yxatdan o'tkazishda biroz farq qiladi:

Startup.cs - RequireHttpsAttribute:

public void ConfigureServices(IServiceCollection services)
{
    // TODO: Register other services

    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(RequireHttpsAttribute));
    });
}

Dizayn qarorlari tushuntirildi:

  1. Global sozlash uchun Startup.cs da filtrdan foydalaning (chunki bu hamma joyda qo‘llanilishini xohlaymiz). Startap barcha global qoidalarni ro'yxatdan o'tkazish va o'rnatish uchun javobgar bo'lishi kerak. Agar sizning kompaniyangiz yangi ishlab chiquvchini ish bilan ta'minlasa, u Startup.cs da global sozlashni topishini kutadi.
  2. RequireHttpsAttribute mantiqidan foydalaning, chunki u tasdiqlangan (Microsoft tomonidan). Hech qachon "http://" va "https://" kabi "sehrli" satrlardan foydalanmang, agar bir xil mantiqni ta'minlash uchun yaratilgan Microsoft komponentini qayta ishlatish orqali oldini olish mumkin.

Agar siz MVC veb-saytingizni SSL holda localhost-da ishlayotgan bo'lsangiz:

  • http://localhost:1337/ (SSL yo'q)
  • https://localhost:1337/ (SSL)

https://stackoverflow.com/a/38244992/1095493 ko‘rib chiqing.

Eslatma:

alternativ sifatida biz "klass BaseController : Controller" ni yaratishimiz va barcha kontrollerlarimizni "BaseController" dan (Controller o'rniga) meros qilib olishimiz mumkin. Keyin biz faqat atribut 1 global joyni o'rnatishimiz kerak (va filtrni Startup.cs da ro'yxatdan o'tkazish shart emas).

Ba'zi odamlar atribut uslubini afzal ko'rishadi.

Foydalanish misoli:

[RequireHttpsAttribute]
public class BaseController : Controller
{
    // Maybe you have other shared controller logic..
}

public class HomeController : BaseController
{
    // Add endpoints (GET / POST) for Home controller
}
person Nick Niebling    schedule 07.07.2016

Global.asax.cs sahifasida global atributlarni ro'yxatdan o'tkazish uchun "RegisterGlobalFilters" dan foydalaning.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new RequireHttpsAttribute());
    //e.g. filters.Add(new HandleErrorAttribute());
    //e.g. filters.Add(new System.Web.Mvc.AuthorizeAttribute());            
}
person Dhanuka777    schedule 18.04.2016

Siz barcha kontrollerlaringiz uchun asosiy sinfdan foydalanishingiz mumkin va uni talab ssl atributi bilan bezashingiz mumkin.

person DanP    schedule 19.07.2010
comment
Men (yoki boshqa jamoa a'zosi) tasodifan atributni yangi kontrollerga qo'shishni unutishni xohlamayman yoki shunga o'xshab, asosiy sinfdan meros olishni unutaman. Biz bu aql bovar qilmaydigan bo'lishini xohlaymiz. - person CodeGrue; 20.07.2010
comment
@CodeGrue: siz har doim barcha kontrollerlaringiz ushbu atributdan foydalanishini tasdiqlovchi birlik testini qo'shishingiz mumkin; serializable atributiga oid so'nggi savolimga qarang: stackoverflow.com/questions/3257004/ - person DanP; 20.07.2010