WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

基本認証

by WebSurfer 2015年11月23日 14:19

IIS7 で基本認証を行う際のブラウザとサーバーのやり取りを調べましたので備忘録として書いておきます。

基本認証のやり取り

上の画像は IIS7 と IE9 で基本認証を行った場合の要求 / 応答を Fiddler2 でキャプチャしたものです。

  1. 最初の要求に対してはサーバーから応答ヘッダに WWW-Authenticate: Basic realm="xxx" を含む HTTP 401 応答が返ってきます。上の画像の #2 がそれです。xxx には IIS7 の場合ホスト名が入ります。
  2. ブラウザはそれを受けてユーザーに[ユーザー名]と[パスワード]の入力を促すダイアログを表示します。
  3. ユーザーがダイアログに[ユーザー名]と[パスワード]を入力して[OK]ボタンをクリックすると、ブラウザは 1 で要求したページを再度 GET 要求します。上の画像の #3 がそれです。
  4. その際、ブラウザは認証用のヘッダ Authorization: Basic UGFwaWt...(上の画像で赤枠で囲った部分を見てください)をサーバーに送ります。UGFwaWt... の部分は[ユーザ名]と[パスワード]をコロン ":" でつなぎ Base64 でエンコードしたものです。
  5. サーバーはこのヘッダを見てユーザーを認証し、HTTP 200 ステータスコード(成功)と共に要求されたコンテンツをブラウザに送信します。
  6. これ以降、ユーザーがブラウザを閉じない限りホスト名 xxx に対しては認証用のヘッダ(画像で赤枠で囲ったものと同じ)が要求ヘッダに含まれて送信され、要求のたび自動的に認証が行われるようになります。上の画像の #4, #5 がそれです。

以上、基本認証でのブラウザとサーバーのやり取りを簡単にまとめてみました。

フォーム認証と Windows 認証の場合は、それぞれ先の記事「Forms 認証のログイン・ログオフ動作」と「非ドメインユーザーの誘導」に書きましたので興味がありましたら見てください。

Tags: ,

Authentication

GridView に overflow 適用、三点リーダー表示

by WebSurfer 2015年11月10日 14:04

GridView の列に長い文字列を入れると、下の画像の「制限しない場合」のように文字列の長さに応じて列の幅が広がっていってしまいます。

それを下の画像の「overflow:hidden で制限」のように、CSS の overflow を使って決まった範囲内に制限する方法について書きます。(テキストが領域をこえた場合に三点リーダー「…」を表示することもできます。詳しくはこの記事の下の方の 2015/11/12 追記を見てください)

GridView に overflow 適用

ASP.NET が GridView を html コードにレンダリングすると table, tr, th, td 要素になります。BoundField を使うと文字列は td 要素の中に直接配置されます。

td 要素はブロックレベル要素ではないのでそれに直接 overflow は適用できません。なので、td 要素の中に div 要素を 配置しそれに overflow 他のスタイルを適用した上で div 要素内に文字列を入れるのがよさそうです。

クライアント側だけで JavaScript を使っても可能ですが、ASP.NET のコードで対応した方が簡単そうです。

具体的には、当該列を TemplateField に変換し、それに div 要素を配置して overflow 他のスタイルを適用、div 要素の中に Literal コントロールを配置してその Text プロパティをデータバインドします。

そのコード例は以下の通りで、これを実行すると上の画像の結果になります。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      // データソースとして DataTable を作成。
      DataTable dt = new DataTable();
      DataRow dr;

      dt.Columns.Add(new DataColumn("id", typeof(Int32)));
      dt.Columns.Add(
          new DataColumn("description", typeof(string)));

      dr = dt.NewRow();
      dr["id"] = 1;
      dr["description"] = "グリッドビューはデータソースの"+ 
                          "値を表に表示します。";
      dt.Rows.Add(dr);

      dr = dt.NewRow();
      dr["id"] = 2;
      dr["description"] = "The GridView displays the " + 
                      "values of a data source in a table.";
      dt.Rows.Add(dr);

      // 上で作成した DataTable を GridView にバインド。
      GridView1.DataSource = dt;
      GridView1.DataBind();

      GridView2.DataSource = dt;
      GridView2.DataBind();
    }
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>GirdView に overflow 適用</title>
  <style type="text/css">
    div.style1
    {
      width: 150px;
      height: 1.1em;
      overflow: hidden;
    }
  </style>
</head>
<body>
  <form id="form1" runat="server">
  <h2>制限しない場合</h2>
  <asp:GridView ID="GridView1" runat="server">
  </asp:GridView>

  <h2>overflow:hidden で制限</h2>
  <asp:GridView ID="GridView2" 
    runat="server" 
    AutoGenerateColumns="False">
    <Columns>
      <asp:BoundField DataField="id" HeaderText="id" />
      <asp:TemplateField HeaderText="description">
        <ItemTemplate>
          <div class="style1">
            <asp:Literal ID="Literal1" 
              runat="server" 
              Text='<%# Eval("description") %>'>
            </asp:Literal>
          </div>
        </ItemTemplate>
      </asp:TemplateField>
    </Columns>
  </asp:GridView>
  </form>
</body>
</html>

------ 2015/11/12 追記 ------

テキストが領域をこえた場合に三点リーダー「…」を表示する text-overflow:ellipsis はもともと IE の独自拡張だそうですが、最近は他のブラウザでも取り入れられているようです。下の画像は、自分の環境 Vista SP2 32-bit で、Opera 12.17 で試した結果です。

text-overflow:ellipsis 適用

IE9, Chrome 46.0.2490.86 m, Firefox 42.0, Safari 5.1.7 でも同様に text-overflow:ellipsis は有効でした。(古いバージョン、その他のブラウザは未確認です)

上の画像の例ではスタイルを以下のように変更しています。

<style type="text/css">
    div.style1
    {
        width: 150px;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
    }
</style>

Tags: ,

ASP.NET

CheckBoxList のチェックマーク設定

by WebSurfer 2015年11月2日 18:08

CheckBoxList をデータバインドする際、その子コントロールの ListItem の Text, Value, Selected プロパティを同時に設定する方法について書きます。

CheckBoxList のチェックマーク設定

たぶん Text と Value プロパティをデーターベースから取得するなどして設定しておき、Selected プロパティ(チェックマーク)はユーザーが設定するというシナリオが多いと思います。

それに加えて Selected プロパティもデーターベースから取得した値であらかじめ設定しておきたいという場合を考えます。

ListItem の Text と Value プロパティは、Visual Studio のデザイン画面で CheckBoxList の DataTextField と DataValueField プロパティにデーターソースのフィールド名を指定しておけば自動的に設定されます。

Selected プロパティの方は CheckBoxList.DataBound イベントのハンドラで設定するのがよさそうです。

以下に Microsoft が提供しているサンプルデータベース Northwind の Products テーブルの ProdctName (int), ProductID (nvarchar), Discontinued (bit) を ListItem の Value, Text, Selected プロパティに設定するサンプルを作ってみました。

オマケに、GridView に CheckBox を実装して同様な形になるものも追加しておきました。どちらがいいかは使い方によると思います。

詳しい説明はサンプルのコメントに書きましたのでそれを見てください。手抜きでスミマセン。(汗)

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    
    // CheckBoxList の ListItem の Text, Value, Selected プロパ
    // ティそれぞれに Products テーブルの ProdctName, ProductID,
    // Discontinued を設定する。

    // Page_Load で Products テーブルの ProdctName, ProductID,
    // Discontinued から DataView を作成して保持する。
    DataView dataView;

    // DataView を作成して手動で CheckBoxList に DataBind。
    // そこで各 ListItem の Text, Value プロパティは自動的に設
    // 定される。
    protected void Page_Load(object sender, EventArgs e)
    {        
        if (!IsPostBack)
        {
            dataView = (DataView)SqlDataSource1.Select(
                            DataSourceSelectArguments.Empty);
            CheckBoxList1.DataSource = dataView;
            CheckBoxList1.DataBind();
        }
    }

    // Page_Load での CheckBoxList1.DataBind() により DataBound
    // イベントが発生する。Page_Load で取得した DataView を利用
    // して ListItem の Selected プロパティに Discontiued の値
    // を設定する。
    protected void CheckBoxList1_DataBound(
                            object sender, EventArgs e)
    {
        CheckBoxList list = (CheckBoxList)sender;
        foreach (ListItem item in list.Items)
        {
            dataView.RowFilter = 
                String.Format("ProductID='{0}'", item.Value);
            bool auth = (bool)dataView[0]["Discontinued"];
            item.Selected = auth;
        }
    }

    // GridView の場合は RowDataBound イベントで DataRowView が
    // 取得できる。なので、DataView を保持しておく必要はなく、
    // GridView.DataSourceID に SqlDataSource の ID を設定して
    // データバインドは自動的に行うようにすることが可能。
    protected void GridView1_RowDataBound(
                    object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView drv = (DataRowView)e.Row.DataItem;
            CheckBox cb = 
                (CheckBox)e.Row.FindControl("CheckBox1");
            if (cb != null)
            {
                int id = (int)drv["ProductID"];

                // Attributes ではなく InputAttributes を使う
                cb.InputAttributes.Add("value", id.ToString());
            }
        }

    }    
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
          ConnectionString="<%$ ConnectionStrings:Northwind %>" 
          SelectCommand=
                "SELECT TOP 10 
                [ProductID], [ProductName], [Discontinued] 
                FROM [Products]">
        </asp:SqlDataSource>

        <h3>CheckBoxList</h3>
        <asp:CheckBoxList 
            ID="CheckBoxList1" 
            runat="server" 
            DataTextField="ProductName" 
            DataValueField="ProductID" 
            OnDataBound="CheckBoxList1_DataBound">
        </asp:CheckBoxList>

        <hr />

        <h3>GridView</h3>
        <asp:GridView ID="GridView1" 
            runat="server" 
            AutoGenerateColumns="False" 
            DataKeyNames="ProductID" 
            DataSourceID="SqlDataSource1" 
            ShowHeader="False" 
            OnRowDataBound="GridView1_RowDataBound" 
            GridLines="None">
            <Columns>
                <asp:TemplateField HeaderText="Discontinued" 
                    SortExpression="Discontinued">                    
                    <ItemTemplate>
                      <asp:CheckBox ID="CheckBox1" 
                        runat="server"
                        Checked='<%# Bind("Discontinued") %>' />
                    </ItemTemplate>
                </asp:TemplateField>                
                <asp:BoundField DataField="ProductName" 
                    HeaderText="ProductName" 
                    SortExpression="ProductName" />                
            </Columns>            
        </asp:GridView>                
    </div>
    </form>
</body>
</html>

Tags:

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar