2016-04-07 24 views
1

Kimlik çerçevesi başvurularımı almaya çalışıyorum kullanıcılarımı atar, böylece yabancı bir anahtar benim sql db içinde yapabilirim, şu anda boş olarak geri dönüyor: enter image description hereOWIN-Getting dbo.AspNetUser Kimliği. User.Identity.GetUserId() null

Benim Startup.cs:

public class Startup 
    { 
    public void Configuration(IAppBuilder app) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 

     ConfigureOAuth(app); 

     config.Routes.MapHttpRoute("DefaultAPI", 
      "api/{controller}/{id}", 
      new { id = RouteParameter.Optional }); 

     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

     app.UseCors(CorsOptions.AllowAll); 
     app.UseWebApi(config); 
    } 

    private void ConfigureOAuth(IAppBuilder app) 
    { 
     OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = new SimpleAuthorizationServerProvider() 
     }; 

     app.UseOAuthAuthorizationServer(OAuthServerOptions); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
    } 
} 

SimpleAuthorizationServerProvider:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     //context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     using (AuthRepository _repo = new AuthRepository()) 
     { 
      IdentityUser user = await _repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       return; 
      } 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim("sub", context.UserName)); 
     identity.AddClaim(new Claim("role", "user")); 
     identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 

     context.Validated(identity); 

    } 
} 

AuthRespository.cs:

public class AuthRepository : IDisposable 
{ 
    private AuthContext _ctx; 
    private UserManager<IdentityUser> _userManager; 

    public AuthRepository() 
    { 
     _ctx = new AuthContext(); 
     _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx)); 
    } 

    public async Task<IdentityResult> RegisterUser(UserModel userModel) 
    { 
     IdentityUser user = new IdentityUser 
     { 
      UserName = userModel.UserName 
     }; 

     var result = await _userManager.CreateAsync(user, userModel.Password); 

     return result; 
    } 

    public async Task<IdentityUser> FindUser(string userName, string password) 
    { 
     IdentityUser user = await _userManager.FindAsync(userName, password); 

     return user; 
    } 

    public void Dispose() 
    { 
     _ctx.Dispose(); 
     _userManager.Dispose(); 

    } 
} 

UserModel.cs:

public class UserModel 
{ 

    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

} 

GrantResourceOwnerCredentials context.UserName doğru ayarlanmış olduğundan içine denetim akışı alır ama context.ClientId boş. Bu bilgiyi nasıl alabilirim?

Düzenleme:

ben kod satırlarında görüyoruz:

using (AuthRepository _repo = new AuthRepository()) 
     { 
      IdentityUser user = await _repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       return; 
      } 
     } 

user.Id aradığım tam Kimliği. Ama ben context.ClientId için atamak için izin verilmez. Herhangi bir fikir?

+0

Istemcinizde client_id mü var? – dan

+0

En altta yaptığım düzenlemeyi kontrol edin, bağlamda değildi – Pipeline

+0

Bu bağlantıya bakın. https://msdn.microsoft.com/en-us/library/microsoft.owin.security.oauth.oauthgrantresourceownercredentialscontext.clientid(v=vs.113).aspx#P:Microsoft.Owin.Security.OAuth.OAuthGrantResourceOwnerCredentialsContext.ClientId Özel set olduğu için ClientId içindeki değeri GrantResourceOwnerCredentials içinden geçiremezsiniz. Eğer ClientId'de bir değere sahip olmak istiyorsanız, isteğinizde mevcut olmalıdır – dan

cevap

0

User.Id özelliğini alarak ve bunu kimliğimde bir SID Hak Talebine manüel olarak ayarlayarak bunu hallettiniz. Mükemmel değil ama yine de aynı kimlik.

+0

Bu arkadaşı nasıl çözdünüz? –

İlgili konular