FacebookAuthenticationOptionsのインスタンスを作成して構成する必要がありますProvider。には、ログイン時にトリガーされるというイベントProviderが含まれています。OnAuthenticated
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));
return Task.FromResult(0);
}
},
// You can store these on AppSettings
AppId = ConfigurationManager.AppSettings["facebook:AppId"],
AppSecret = ConfigurationManager.AppSettings["facebook:AppSecret"]
};
app.UseFacebookAuthentication(facebookOptions);
上記のコードでは、access_tokenbyにアクセスして、現在ログインしているユーザーにcontext.AccessToken追加しています。Claims
後でこの値にアクセスするには、次のようにする必要があります。
var owinContext = HttpContext.GetOwinContext();
var authentication = owinContext.Authentication;
var user = autentication.User;
var claim = (user.Identity as ClaimsIdentity).FindFirst("urn:facebook:access_token");
string accessToken;
if (claim != null)
accessToken = claim.Value;
これらすべてを簡素化するために、 を作成してBaseController、すべてをControllers継承させることができます。
BaseControllerコードは次のようになります。
public class BaseController : Controller
{
public IOwinContext CurrentOwinContext
{
get
{
return HttpContext.GetOwinContext();
}
}
public IAuthenticationManager Authentication
{
get
{
return CurrentOwinContext.Authentication;
}
}
public new ClaimsPrincipal User
{
get
{
return Authentication.User;
}
}
public ClaimsIdentity Identity
{
get
{
return Authentication.User.Identity as ClaimsIdentity;
}
}
public string FacebookAccessToken
{
get
{
var claim = Identity.FindFirst("urn:facebook:access_token");
if (claim == null)
return null;
return claim.Value;
}
}
}
次に、コードでアクセス トークンを取得するには、プロパティにアクセスするだけですFacebookAccessToken。
string accessToken = FacebookAccessToken;
他の値を次のように取得することができます。
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:username",
context.User.Value<string>("username"), ClaimValueTypes.String, "Facebook"));
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:name",
context.User.Value<string>("name"), ClaimValueTypes.String, "Facebook"));
メールを要求するために必要なメールを取得するために、すべてのフィールドが利用できるわけではないことに注意してくださいScope。
facebookOptions.Scope.Add("email");
次に、OnAuthenticatedイベントにアクセスします
context.User.Value<string>("email");