17

ASP.NETWebサイトがあります。

たとえば、ログインしていないユーザーがログインページに自動的に(再)リダイレクトされるようにしたい。

~/Account/Login.aspx

default.aspx現在のように、ユーザーはログインせずにページ(たとえば)にアクセスできます。


:ASP.NETには、すべての(および任意の)ページが読み込まれる前に背後で発生する独自の認証サイクルがあるという(おそらく正しくない)仮定に基づいて操作しています。


アップデート@asawyerは、質問への回答には役立たないものの、かなりのグラフィックを提供するリンクを提供しました。

ここに画像の説明を入力してください

さて、あなたは何を試しましたか?

フォーム認証を有効にするweb.configファイルがあります。

<?xml version="1.0"?>
...
<configuration>
   ...
   <system.web>
      <authentication mode="Forms">
         <forms loginUrl="~/Account/Login.aspx" name=".ASPXFORMSAUTH" slidingExpiration="true"/>
      </authentication>
      ...
   </system.web>
   ...
</configuration>

「デフォルト」ページを参照すると、たとえば、それを表示できます。

GET http://localhost:53149/WebSite/ HTTP/1.1
Host: localhost:53149

そして、私はページの内容を取得します:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0

つまり、Webサイトへのログインを強制されるのではなく、Webサイトへのログインを強制されることはありません

これは、私のブラウザがWebサーバーに対してローカルで実行されているという事実に関連している可能性があります。しかし、私は認証でFormsはなくWindows(そしてそうPassportではなくNone)認証を使用しています。

ボーナスリーディング

4

4 に答える 4

28

私は答えを見つけました。

質問:ログインしていないユーザーをログインページに自動的にリダイレクトするにはどうすればよいですか?
回答:匿名ユーザーのアクセスを拒否する


長い説明

ログインしていないユーザーをログインページに自動的にリダイレクトするには、「すべての」ページへの匿名アクセスを拒否する必要があります。これは、サイトのweb.configファイルで行われます。

web.config

<?xml version="1.0"?>
<configuration>
   <system.web>
      ...
      <authorization>
         <deny users="?"/>
      </authorization>
   </system.web>
</configuration>

特別な?トークンは、匿名ユーザーを表すために使用されます。

これは、「ログイン」ページがどこにあるかをフォーム認証に指示することと組み合わせると、次のようになります。

<?xml version="1.0"?>
<configuration>
   <system.web>
      ...
      <authentication mode="Forms">
         <forms loginUrl="~/Account/Login.aspx" timeout="2880"/>
      </authentication>
      <authorization>
         <deny users="?"/>
      </authorization>
   </system.web>
</configuration>

これは、匿名ユーザーが自動的にログインページにリダイレクトされることを意味します。


今まで聞いたことのないような質問に答えて、みんな生きています。

于 2012-06-08T21:11:32.617 に答える
3

すべてのページが最初にログインしていたことを強制したい場合は、認証要求をキャプチャして、global.asaxプログラムで次のように作成できます。

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    // This is the page
    string cTheFile = HttpContext.Current.Request.Path;

    // Check if I am all ready on login page to avoid crash
    if (!cTheFile.EndsWith("login.aspx"))
    {
        // Extract the form's authentication cookie
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = Context.Request.Cookies[cookieName];

        // If not logged in
        if (null == authCookie)
        // Alternative way of checking:
        //     if (HttpContext.Current.User == null || HttpContext.Current.User.Identity == null || !HttpContext.Current.User.Identity.IsAuthenticated)
        {
            Response.Redirect("/login.aspx", true);
            Response.End();
            return;
        }
    }
}

このコードはすべてのページで呼び出され、サイトのすべてのページをチェックします。

于 2012-06-08T21:01:19.113 に答える
1

何年も経っていることは知っていますが、誰かがここで自分自身を見つけた場合は、webconfigでこのビットが欠落している可能性があります。タグ内にこれを追加する必要があります:

<location path="SecurePage.aspx">
<system.web>
  <authorization>
    <deny users="?"/>
  </authorization>
</system.web>

これは、SecurePage.aspxがユーザーにログインを要求することをサイトに通知します。これは、私が数年間行ってきた方法です。

于 2019-06-05T13:09:12.070 に答える
0

これをweb.configに追加します

<system.web>
    // ...
    <authentication mode="Forms">
        <forms loginUrl="~/Account/Login.aspx" 
               name=".ASPXFORMSAUTH" 
               slidingExpiration="true" />
    </authentication>
</system.web>
于 2012-06-08T20:29:31.780 に答える