2017-08-09 48 views
0

私はASP.NET WEB APIを使用してREST APIを実装しています。2.I get/app/Account/ExternalLoginのメソッドを持つデフォルトのAccountController実装があります。User.Identity.IsAuthenticatedは常にfalseを返します

[OverrideAuthentication] 
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
[AllowAnonymous] 
[Route("ExternalLogin", Name = "ExternalLogin")] 
public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 
{ 
    if (error != null) 
    { 
     return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error)); 
    } 

    if (!User.Identity.IsAuthenticated) 
    { 
     return new ChallengeResult(provider, this); 
    } 

    ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 

    if (externalLogin == null) 
    { 
     return InternalServerError(); 
    } 

    if (externalLogin.LoginProvider != provider) 
    { 
     Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
     return new ChallengeResult(provider, this); 
    } 

    ApplicationUser user = await UserManager.FindAsync(new UserLoginInfo(externalLogin.LoginProvider, 
     externalLogin.ProviderKey)); 

    bool hasRegistered = user != null; 

    if (hasRegistered) 
    { 
     Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

     ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager, 
      OAuthDefaults.AuthenticationType); 
     ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager, 
      CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName); 
     Authentication.SignIn(properties, oAuthIdentity, cookieIdentity); 
    } 
    else 
    { 
     IEnumerable<Claim> claims = externalLogin.GetClaims(); 
     ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType); 
     Authentication.SignIn(identity); 
    } 

    return Ok(); 
} 

私はインターネットを見てきましたが、この状況に該当するものは見つかりませんでした。

私が使用してURL

https_://_www.dummydomain.com:?43363/API /アカウント/ ExternalLoginプロバイダ=グーグル& response_type =トークン&のclient_id =自己& REDIRECT_URI = HTTPS%3A%2F %2Fwww.dummydomain.com%の3A43363%2F &状態= jI4zGXuaVvHI8qf9E0Nww3qBwke0YsYwD9AORwKBj3o1

すべての外部サービス(グーグル/ FB)がcorrecltyに動作します。私はAspNet.ExternalCookieが設定されている参照が、私が許可されていないことだし、AppControllerRequest財産の

{ 
    email:null, 
    hasRegistred: true, 
    loginProvaider: null 
} 

アップデート1

Properties辞書はMS_UserPrincipalが含まれていない取得戻ってリダイレクトします。

添付のスクリーンショットを参照してください。 Properties keys

Request.Properties["MS_HttpContext"]を返す:(スクリーンショットを参照) MS_HttpContextobject

答えて

0

それはAPIControllerに直接のHttpContextプロパティを使用することができませんでしだ。これを得るには、System.Net.Http.HttpRequestMessage型のRequestプロパティを使用する必要があります。 HttpRequestMessageにはプロパティ辞書があります。 MS_UserPrincipalがIPrincipalオブジェクトを保持するキーの値を見つけることができます。

+0

これは私のためには機能しません。 MS_UserPrincipalが見逃されているようです。スクリーンショットhttps://www.screencast.com/t/FpMDjU1Oをご覧ください。 –

関連する問題