コントローラ アクションに属性 [RequireSSL] を追加して、ログイン ページを Https として有効にしましたが、正常に動作します。ただし、ログインに成功した後は https 環境のままですが、ページは非 https ページです。httpsモードからhttpモードに移行する回避策を教えてもらえますか? この点でどんな助けでも大歓迎です。
3 に答える
注意:同様の質問がありました。私が学んだ重要なことの1つは、HTTPに切り替えた後、認証Cookieがプレーンテキストで送信されることです。これを参照してください。
注意2:恐ろしいことを考慮することを忘れないでくださいあなたは安全なメッセージではない接続にリダイレクトされようとしています
銀行のアプリケーションを作成している場合は、細心の注意を払う必要があります。また、公共のWi-Fi接続を使用するユーザーの数が増えていることを認識してください。おそらく主流のサイトにとってははるかに大きな懸念ですが、私たち全員が知っておくべき懸念です。
私の他の質問も参照してください(執筆時点では回答はありませんが、質問しただけです!)
基本的に反対のことをする必要があります。これには [DoesNotRequireSSL] 属性があり、{RequireSSL] 属性の反対を効果的に行います。つまり、http プロトコルにリダイレクトします。
public class DoesNotRequireSSL: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var response = filterContext.HttpContext.Response;
if (request.IsSecureConnection && !request.IsLocal)
{
string redirectUrl = request.Url.ToString().Replace("https:", "http:");
response.Redirect(redirectUrl);
}
base.OnActionExecuting(filterContext);
}
}
また、複数のページがこの動作をするようにしたい場合は、基本コントローラーを設定できます。そこからすべての非 http コントローラーを継承できるため、必要なすべてのページで自分自身を繰り返さなければならないことを心配する必要はありません。これ。
RequireHttpsAttribute
これはかなり古い質問ですが、上記のリンクの多くは無効になっています。このコードは、System.Web.Mvc 名前空間に含まれている に若干の変更を加えることで、ASP.NET MVC 5 に対応しています。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ForbidHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext.Request.IsSecureConnection)
{
HandleHttpsRequest(filterContext);
}
}
protected virtual void HandleHttpsRequest(AuthorizationContext filterContext)
{
// only redirect for GET requests, otherwise the browser might not propagate the verb and request
// body correctly.
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("The requested resource can only be accessed *without* SSL.");
}
// redirect to HTTP version of page
var url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
}
このコードは、ユーザーに HTTPS から HTTP へのリダイレクトを強制することによるセキュリティ上の問題について簡単に説明しているこの記事からのものです。