IT業界のすみっこ暮らし

ふと気がついたときの記録

ASP.NET Web API:Basic認証

.NET MVCのWeb APIBasic認証を適用する方法

f:id:papamau:20171018134917p:plain ↑の「Web API」を選択して作成したプロジェクトを基準とする。

docs.microsoft.com

MSDNに凄く詳しく書いているので、基本的にはそのままに良い。
以下、自分用のメモになります。

Web.config

<system.web>
    ...
    <authentication mode="Windows" />
</system.web>
<system.webServer>
    <modules>
        ...
        <add name="BasicAuthHttpModule" type="TestProject.Base.BasicAuthHttpModule, TestProject" />
    </modules>
</system.webServer>

BasicAuthHttpModule.cs

using System;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Web;
using TestProject.Base;

namespace TestProject.Base
{
    /// <summary>
    /// HTTP Basic 認証
    /// </summary>
    public class BasicAuthHttpModule : IHttpModule
    {
        private const string Realm = "Test APIs";

        public void Init(HttpApplication context)
        {
            // Register event handlers
            context.AuthenticateRequest += OnApplicationAuthenticateRequest;
            context.EndRequest += OnApplicationEndRequest;
        }

        private static void SetPrincipal(IPrincipal principal)
        {
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }

        private static void AuthenticateUser(string credentials)
        {
            try
            {
                var encoding = Encoding.GetEncoding("iso-8859-1");
                credentials = encoding.GetString(Convert.FromBase64String(credentials));

                int separator = credentials.IndexOf(':');
                string username = credentials.Substring(0, separator);
                string password = credentials.Substring(separator + 1);

                // CheckPassword内でDBの値と比較するなりして認証可否を確認する
                if (CheckPassword(name, password))
                {
                    // 認証後の必要処理を行う
                    var identity = new GenericIdentity(name);
                    SetPrincipal(new GenericPrincipal(identity, null));
                }
                else
                {
                    // Invalid username or password.
                    HttpContext.Current.Response.StatusCode = 401;
                }
            }
            catch (FormatException)
            {
                HttpContext.Current.Response.StatusCode = 401;
            }
        }

        private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var request = HttpContext.Current.Request;
            var authHeader = request.Headers["Authorization"];
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) && authHeaderVal.Parameter != null)
                {
                    AuthenticateUser(authHeaderVal.Parameter);
                    //if (!AuthenticateUser(authHeaderVal.Parameter))
                    //{
                    //    HttpContext.Current.Response.StatusCode = 401;
                    //}
                }
            }
        }

        // If the request was unauthorized, add the WWW-Authenticate header 
        // to the response.
        private static void OnApplicationEndRequest(object sender, EventArgs e)
        {
            var response = HttpContext.Current.Response;
            if (response.StatusCode == 401)
            {
                response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", Realm));
            }
        }

        public void Dispose()
        {
        }
    }
}

TestController.cs

[Authorize]
public class TestController : ApiController

C#:Json内のhtmlタグのエスケープについて

1、JavaScriptSerializer:string ⇒ JSON変換

using System.Web.Script.Serialization;

var json = new JavaScriptSerializer().Serialize("A->B"); // "\"A-\\u003eB\"

HTMLタグのエスケープ

JavaScriptSerializerを利用してJSONに変換する場合、HTMLタグは\u形式のユニコードエスケープされる。
そのため、JSON内のHTMLタグをそのまま使うことが出来ず、"\u003e"⇒">"な感じで再度変換してあげる必要がある。

stackoverflow.com

stackoverflow.com

2、 Json.NET:string ⇒ JSON変換

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject("A->B") // "\"A->B\""

HTMLタグをそのままにしてJSONに変換したい場合はJson.NETを使う。

jquery:clickイベントの上書き

tategakibunko.hatenablog.com

stackoverflow.com

// ex1
$("#selector").unbind("click").click(function(){ //処理 }); 

// ex2
$('#clickme').unbind('click').click(fireclick);

PyCon JP 2017に参加してきました。

だいぶ日にちが経ちましたが、せっかくなので参加記念にまとめてみました。

f:id:papamau:20170922122847p:plain

pyconjp.connpass.com

PyCon JPとは?

PyCon JPは、Pythonユーザが集まり、PythonPythonを使ったソフトウェアについて情報交換、交流をするためのカンファレンスです。PyCon JPの開催を通じて、Pythonの使い手が一堂に集まり、Pythonにまつわる様々な分野の知識や情報を交換し、新たな友達やコミュニティとのつながり、仕事やビジネスチャンスを増やせる場所とすることが目標です。

PyCon JP 2017では「Output & Follow」をテーマに据えました。Pythonをキーワードに多様な人たちが、いろいろ楽しめて、新しい可能性が生まれるカンファレンスを目指して、スタッフ全員で企画を進めています。

公式サイト

pycon.jp

スケジュール

メインイベントは9/8(金)~9/9(土)の二日間に行われたので、両日参加しました。

pycon.jp

当時風景など

f:id:papamau:20170922123714p:plain:w300

f:id:papamau:20170922123858p:plain:w300

f:id:papamau:20170922124007p:plain:w400
基調講演 | PyCon JP 2017 in TOKYO

f:id:papamau:20170922124023p:plain:w300
プレゼンテーション:ドローンのフライトコントローラをPythonで制御してみた話 | PyCon JP 2017 in TOKYO

f:id:papamau:20170922124319p:plain:w400 f:id:papamau:20170922124336p:plain:w400

感想

一つの言語を中心としたイベントは初めてだったのでとても楽しかったです。

内容はセッションによって好みと知識によって当たり外れがあると思いますが、私はドローン開発に関するセッションが一番面白かったです。実用性も高いし空を飛ばせる夢ことに関してもロマン的なものがあって良いなと思いました。

余談ですが、一日中興味のあるセッションが行われる場所に移動しまくるので夕方ごろにはもうヘトヘトになりました。何をするにも体力が一番大事!

参加したセッション一覧

  • 基調講演:Peter Wang
  • ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い
  • Pythonで大量データ処理!PySparkを用いたデータ分析のきほん
  • Kivyによるアプリケーション開発のすすめ
  • PythonとRを行ったり来たり
  • Pythonによる文章自動生成入門!Python ✖︎ 自然言語処理 ✖︎ ディープラーニング
  • Pythonistaで始めるiOSプロトタイプ開発
  • ドローンのフライトコントローラをPythonで制御してみた話
  • Pythonで実現する4コマ漫画の分析・評論 2017

以上

.Net Frameworkのアップグレード

何がしたい?

.Net Framework 4.0のプロジェクトでC# 6を使いたい。
そもそもC# 6は.Net Framework 4.5以上でしか動かない。
.Net FrameworkをアップグレードしてC# 6を使おう ← イマココ!

必要なこと

1、CodeDOM Providers for .NET Compilerインストール

※NugetパッケージでWeb.configに下記のような内容が追記されるので確認する。自分で追加する必要はない。

<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
</system.codedom>


2、.Net Frameworkバージョン依存のNugetパッケージの更新

1のようにバージョンを上げると、DBコネクターなどのNugetパッケージを参照してるところがコンパイルエラーになる場合があるが、その場合は自分で更新しながら検証する必要がある

参考

stackoverflow.com

IISでwebフォントのファイルが404エラーになる場合の対策

経緯

正常に動作しているのに、何故かwebフォントファイルが404エラーになっている。 f:id:papamau:20170911184320p:plain

因みにローカル環境では起きてない。

原因

IISが「woff」と「woff2」のMIMEタイプを認識できないため、404エラーになる

対策

Web.configの中に以下の記述を追加し、「woff」と「woff2」のMIMEタイプを認識できるようにする。

<system.webServer>
...
  <staticContent>
    <remove fileExtension=".woff" />
    <mimeMap fileExtension=".woff" mimeType="application/x-font-woff" />
    <remove fileExtension=".woff2" />
    <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
  </staticContent>
</system.webServer>

参考

stackoverflow.com

sweetalert関連ブクマ

f:id:papamau:20170907122447p:plain SweetAlert makes popup messages easy and pretty.

sweetalert.js.org

SweetAlert - Change Modal Width?

stackoverflow.com

SweetAlert2

SweetAlert2 - a beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes

What’s the difference between sweetalert and sweetalert2?

github.com

Migration from SweetAlert to SweetAlert2

github.com

sweetalert2 VS SweetAlert

js.libhunt.com


2017年9月現在、業務ではsweetalertを使用している。
今回、sweetalert2への移行を考慮して違いなどを少し調べてみたけど、sweetalert2はie未対応のため別途ライブラリが必要だったり、sweetalertとは使い方が若干異なるため、既存のコードの修正・検証にリソースが必要になることが分かった。
で、しばらくはsweetalertで良いかなと思っている。新規PJやリニューアル案件があれば、そのタイミングでsweetalert2を導入したいと思う。

広告を非表示にする