2017-05-17 5 views
0

ログインしているユーザーだけが/ api/prenews(たとえば)にアクセスできる必要があるため、ユーザーがログインしているときは、彼を覚えておく必要があります。これが私のやり方です。Web API:ユーザーに正しくサインインするにはどうすればいいですか?

public class PrenewsController : ApiController 
    { 
     /* 
     ... 
     */ 
     public IHttpActionResult GetPrenews() 
     { 
      string currentUser = HttpContext.Current.GetOwinContext().Authentication.User.Claims.FirstOrDefault(k => k.Type == "username").Value; 
      if(currentUser!=null)//the user is logged in 
      {/*...*/} 
      else //the user is not logged in 
      {/*...*/} 
     } 
    } 

しかしHttpContext.Current.GetOwinContext().Authentication.User.Claims.FirstOrDefault(k => k.Type == "username")常にnullである:(。userNameの変数は、ログインが成功した場合は、現在のユーザー名を格納する文字列です)

IList<Claim> claimCollection = new List<Claim> 
{ 
     new Claim("username",userName) 
}; 

ClaimsIdentity claimsIdentity = new ClaimsIdentity(claimCollection); 
HttpContext.Current.GetOwinContext().Authentication.SignIn(new AuthenticationProperties { IsPersistent = false }, claimsIdentity); 

私はこのようなPrenewsController.csを実装しました。私は間違って何をしていますか?

+1

なぜユーザー名を申し立てに保存しますか?ログインしたユーザーのユーザー名を取得するには、より良い方法があります。 –

+0

HttpContext.Current.GetOwinContext()。Authentication.SignInにはClaimsIdentity []の2番目のパラメータが必要です。 – Supercat

答えて

0

User.Identityプロパティからユーザー名を取得できる必要があります。クレームに追加する必要はありません。また、あなたの主張はnullだと思います。あなたの例ではIsPersistentプロパティがfalseに設定されています。作業。

EDITED

これを試してみてください:

var user = userManager.Find(userName, password); 
var userIdentity = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
userIdentity.AddClaim(new Claim("usename", "johndoe")); 
HttpContext.Current.GetOwinContext().Authentication.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, userIdentity) 

この方法はdefinetely私のために働いた..私はそれが役に立てば幸い。

+0

IsPersistentプロパティをtrueに設定しましたが、それでもnullです。私はUser.Identity.Nameからユーザー名を取得しようとしましたが、以前にログインしたとしても常に空の文字列でした。私はHttpContext.Current.GetOwinContext()の周り何かを変更する必要があります。User.IdentityのAuthentication.SignInメソッドは動作するのですか? – Supercat

+0

あなたのsignInメソッドは大丈夫です、あなたのプロジェクトでUserManagerクラスを使用していますか? usermanagerとのクレーム・アライメントを作成すると助けになるかもしれません。 – Geoman

関連する問題