tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

ASP.NET Identityの外部ログインで任意の値をClaimに追加する

https://josealvarez.gallerycdn.vsassets.io/extensions/josealvarez/measpnetidentity/1.0/1482143264518/210260/1/screenshot.png

ASP.NET Identityを使っていて、ログイン後に任意の値を入れたいと思うことが多々あります。例えば、ユーザーを特定するIDやその他ユーザーに付随する情報など。ASP.NET Identityはセキュリティ上認証の際のみClaimに追加できないのでそのイベントのフックと追加方法を説明します。

外部ログインの追加は以下に書きましたので、知りたい方は以下へ。
tekitoumemo.hatenablog.com
tekitoumemo.hatenablog.com

tekitoumemo.hatenablog.com

FaceBook & Google

認証後はOnCreatingTicketへフックされ内部で処理が可能です。

.AddFacebook(facebookOptions =>
{
    facebookOptions.AppId = "";
    facebookOptions.AppSecret = "";
    facebookOptions.Fields.Add("picture");
    facebookOptions.Events = new OAuthEvents
    {
        OnCreatingTicket = context =>
        {
           context.Identity.AddClaim(new Claim("{ユーザーIDのKey}", {ユーザーIDのValue}));
           return Task.CompletedTask;
        }
    };
})

ちなみにFaceBookで画像を取得したい場合は以下のように指定します。

$"https://graph.facebook.com/{facebookのID}/picture"

Twitter

Twitterは特殊でTwitterEventsというものを扱います。ですが基本的にはOAuthEventsと同じです。

.AddTwitter(twitterOptions =>
{
    twitterOptions.ConsumerKey = "";
    twitterOptions.ConsumerSecret = "";
    twitterOptions.Events = new TwitterEvents()
    {
        OnCreatingTicket = async context =>
        {
            Identity.AddClaim(new Claim("{ユーザーIDのKey}", {ユーザーIDのValue}));
            await Task.CompletedTask;
        }
    };
})

SNSのIDを使いまわしても良いのですが、結構めんどい部分が出てくるので任意の値を入れられるのは良いと思いました。あと意外にこの手の記事がなかったよ.NET 普及しろ