55 votes

asp.net c # redirige de http à https

Donc, dans mon code, je veux détecter si ma page de connexion est appelé http, et le rediriger vers https.

Je sais il n'y a pas de code de moyens pour la peau de ce chat, mais pour frustrant technique reasosn je suis soutenu dans le faire dans le code.

            if (!Request.IsSecureConnection)
            {
                string redirectUrl = Request.Url.ToString().Replace("http:", "https:");
                Response.Redirect(redirectUrl);
            }

J'ai donc déposer dans mon Page_Load(...), assurez-vous que mon débogueur utilise de vrais IIS, pas VS2008s IIS, et frappé de débogage.

Dans le débogueur, la valse, le long de, frappé Réponse.Redirect("https://localhost/StudentPortal3G/AccessControl/AdLogin.aspx"), appuyez sur la touche f5...

Obtenez de l' "Internet Explorere Ne peut pas Afficher la page web, l'url est l'adresse HTTP et non HTTPS. Ne pas obtenir une erreur informatif... même chose se produit pas en cours d'exécution dans le débogueur.

Donc ce qui me manque? il ne semble pas être la science de fusée, j'ai vu un code similaire sur beaucoup de blogs...

Ce que je fais mal? Je me dis qu'il doit être tout à fait évidente erreur de débutant, mais je ne suis pas le voir.

87voto

tvanfosson Points 268301

Je ferais un !Request.IsLocal ainsi pour s'assurer que je ne suis pas le débogage, mais si vous êtes à l'aide d'une véritable instance de IIS avec un cert appliquée lors du débogage qui ne devrait pas être un problème.

if (!Request.IsLocal && !Request.IsSecureConnection)
{
    string redirectUrl = Request.Url.ToString().Replace("http:", "https:");
    Response.Redirect(redirectUrl, false);
    HttpContext.ApplicationInstance.CompleteRequest();
}

Note: j'ai mis à jour ce pour être cohérent avec le modèle recommandé pour mettre fin à la demande, suivant le cadre de la documentation.

Lorsque vous utilisez cette méthode dans une page gestionnaire pour mettre fin à une demande de une page et de commencer une nouvelle demande pour une autre page, définissez endResponse à faux, et ensuite appeler la CompleteRequest méthode. Si vous spécifiez true pour le endResponse paramètre, cette méthode appelle la méthode End pour la demande d'origine, ce qui lève une exception ThreadAbortException lorsqu'elle est terminée. Cette exception a un effet néfaste sur le Web la performance de l'application, c'est pourquoi en passant false pour l' endResponse paramètre est recommandé. Pour plus d'informations, voir le Fin de la méthode.

25voto

Ted Points 2819

J'ai l'habitude de les appeler à la suite de la OnPreInit dans une classe de base que toutes mes pages hérite. Bien sûr, vous pourriez faire ce à chaque page...mais vous ne voulez pas le faire maintenant, voulez-vous?

Notez que j'en ai deux propriétés pour chaque page afin que je puisse spécifier la configuration SSL pour chaque page (RequiresSSL) alors que je peux également remplacer et rediriger vérifier si je veux (avec IgnoreRequiresSSL, ce qui est utile pour les pages comme les pages d'erreur que vous réécrivez et ne sais pas si ils vont être cryptées ou non), mais bien sûr, vous pouvez supprimer ces pour de simples paramétrages.

    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);

        if (!IsPostBack)
            RedirectAccordingToRequiresSSL();

        ...
    }

    /// <summary>
    /// Redirect if necessary to ssl or non-ssl enabled URL dependant on RequiresSSL property setting.
    /// </summary>
    private void RedirectAccordingToRequiresSSL()
    {
        if (IgnoreRequiresSSL) return;

        if (RequiresSSL)
        {
            if (!Request.IsSecureConnection) // Need to redirect to https
                RedirectAccordingToRequiresSSL(Uri.UriSchemeHttps);
        }
        else if (Request.IsSecureConnection)
        {
            RedirectAccordingToRequiresSSL(Uri.UriSchemeHttp);
        }

        // Otherwise don't need to do any redirecting as already using the correct scheme
    }

    /// <summary>
    /// Redirect as requested to specified scheme
    /// </summary>
    /// <param name="scheme"></param>
    private void RedirectAccordingToRequiresSSL(string scheme)
    {
        var url = scheme + Uri.SchemeDelimiter + Request.Url.Authority + Request.Url.PathAndQuery;
        Response.Redirect(url, false);
    }

8voto

geo1701 Points 3269

Vous pouvez également utiliser le nouveau UriBuilder:

 Dim context As HttpContext = HttpContext.Current
If Not context.Request.IsSecureConnection Then
    Dim secureUrl As New UriBuilder(context.Request.Url)
    secureUrl.Scheme = "https"
    secureUrl.Port = 443
    context.Response.Redirect(secureUrl.ToString, False)
    Return
End If
 

C #

 HttpContext context = HttpContext.Current;
if (!context.Request.IsSecureConnection)
{
    UriBuilder secureUrl = new UriBuilder(context.Request.Url);
    secureUrl.Scheme = "https";
    secureUrl.Port = 443;
    context.Response.Redirect(secureUrl.ToString(), false);
}
 

2voto

Tom Gullen Points 20826

Voici ma solution:

 // Force HTTPS connection
if (!Request.IsSecureConnection)
{
    var uri = new Uri(Request.Url.ToString());
    var redirectUrl = Settings.CanonicalDomain + uri.PathAndQuery;
    Response.Status = "301 Moved Permanently";
    Response.AddHeader("Location", redirectUrl);
    Response.End();
}
 

Settings.CanonicalDomain est votre nom d'hôte HTTPS. Il 301 redirige ce qui peut être la réponse appropriée dans certains cas.

1voto

Paul Points 7328

avertissement - j'ai été impliqué dans le développement de ce projet

Je vous conseille d'utiliser http://nuget.org/packages/SecurePages/ Il vous donne la possibilité de sécuriser des pages spécifiques ou utiliser des Regex pour définir les matchs. Il sera également force de toutes les pages ne correspondent pas à l'expression régulière ou directement spécifié retour à HTTP.

Vous pouvez l'installer via NuGet: Install-Package SecurePages

Docs sont ici: https://github.com/webadvanced/Secure-Page-manager-for-asp.net#secure-pages

Simple D'Utilisation:

SecurePagesConfiguration.Urls.AddUrl("/cart");

ou

SecurePagesConfiguration.Urls.AddRegex(@"(.*)account", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X