2016-04-05 18 views
0

Asp.net 5 MVC 6'yı kullanarak bir api yapıyorum ve başlangıç ​​için Microsoft tutorial on building new web APIs'u takip ettim. Sonra JWT belirteç tabanlı kimlik doğrulaması uygulamak için this question cevaplarını uyguladım ama burada kaldım:ASP.NET 5 Web API'sinde kimlik kullanıcı yönetimi

if ((req.username == "TEST" && req.password == "TEST") || (req.username == "TEST2" && req.password == "TEST")) 
{ 
    DateTime? expires = DateTime.UtcNow.AddMinutes(2); 
    var token = GetToken(req.username, expires); 
    return new { authenticated = true, entityId = 1, token = token, tokenExpires = expires }; 

} 

yerine ben bir şekilde UserManager sınıf aramak ve kontrol edilmesi gereken bir if ifadenin adı ve şifre aslında bir eşleşirse benim veritabanında kullanıcı, ben benim eski MVC 5 API gibi:

ApplicationUser user = await _userManager.FindAsync(userName, password); 

Ben aslında UserManager bazı uygulama eksik inanıyoruz.

Zaten kullanıcı kimliği olan Identity 2.0 kullanılarak oluşturulan varolan bir veritabanından çalışıyorum. ASP.NET 5 hakkındaki bilgim sınırlıdır, bu yüzden çeşitli rehberleri ve eğiticileri takip ediyorum.

cevap

0

JWT belirteci tabanlı kimlik doğrulamasını uygulamak için aynı örneği kullandım ve tam olarak aynı soruna girdim. Biraz araştırma yaptıktan sonra, haklı olduğunuzdan eminim - UserManager artık kullanıcı adı ve şifreyi doğrulayan bir yönteme sahip değil. Verilen kullanıcı adıyla Kullanıcı daha sonra UserManager.FindByNameAsync ve kullanan Varlığından eğer

Önce kontrol edebilirsiniz:

çözüm bana bunu anlamaya biraz zaman aldı, bu yüzden de bence henüz çok sezgisel oldukça basittir UserManager.CheckPasswordAsync kullanarak doğru şifreyi kontrol edin.

Benim TokenController (aynı zamanda örnek kapsamında değildi, uygun bir ClaimsIdentity oluşturulmasını inclduing) şöyle tamamladı: Ben rolü ve iddia tabanlı kimlik doğrulama ve ben dahil bazı test yaptım

[Route("api/[controller]")] 
public class TokenController : Controller 
{ 
    private readonly UserManager<ApplicationUser> _userManager; 
    private readonly TokenAuthOptions _tokenOptions; 

    public TokenController(TokenAuthOptions tokenOptions, UserManager<ApplicationUser> userManager) 
    { 
     _tokenOptions = tokenOptions; 
     _userManager = userManager; 
    } 

    public class AuthRequest 
    { 
     public string Username { get; set; } 
     public string Password { get; set; } 
    } 

    [HttpPost] 
    public async Task<dynamic> Post([FromBody] AuthRequest req) 
    { 
     var user = await _userManager.FindByNameAsync(req.Username); 

     if (await _userManager.CheckPasswordAsync(user, req.Password)) 
     { 
      DateTime? expires = DateTime.UtcNow.AddMinutes(2); 
      var token = GetToken(req.Username, expires, user); 
      return new { authenticated = true, entityId = user.Id, token = token, tokenExpires = expires }; 
     } 
     return new { authenticated = false }; 
    } 

    private async Task<string> GetToken(string userName, DateTime? expires, ApplicationUser user) 
    { 
     var handler = new JwtSecurityTokenHandler(); 

     var securityToken = handler.CreateToken(
      issuer: _tokenOptions.Issuer, 
      audience: _tokenOptions.Audience, 
      signingCredentials: _tokenOptions.SigningCredentials, 
      subject: new ClaimsIdentity(await _userManager.GetClaimsAsync(user)), 
      expires: expires 
      ); 

     return handler.WriteToken(securityToken); 
    } 
} 

Her şeyin artık intiket gibi çalıştığından oldukça eminim.

+0

Hemen bir göz atacağım, teşekkürler –