2017-05-08 16 views
0

私は新しいWeb APIを作成し、トークン認証にはOAuth2を、DIにはUnityResolverを使用しています。現時点では、自分のuserRepositoryを使用してユーザーを認証する方法について、いくつかの疑問があります。私はこの二日間、多くのアーティキュールを読んできました。私が主に見つけた解決策は、IStoredUser、IUserを実装しています。このケースでは、より良いフィット感があると思います。 この私のコード:独自のuserRepositoryを使用した.NET Owin認証

public class OAuthServerProvider : OAuthAuthorizationServerProvider 
{ 
    IUserAccountService _userAccountService; 

    public OAuthServerProvider(IUserAccountService userAccountService) 
    { 
     _userAccountService = userAccountService; 
    } 

    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     var ipAddress = HttpContext.Current.Request.UserHostAddress; 
     var userAgent = HttpContext.Current.Request.UserAgent; 

     var user = await _userAccountService.GetUserByLogin(context.UserName, context.Password, 1, userAgent, ipAddress); 

     if (user != null && context.UserName == user.email && context.Password == user.password) 
     { 
      identity.AddClaim(new Claim(ClaimTypes.Role, "admin")); 
      identity.AddClaim(new Claim("username", user.email)); 
      identity.AddClaim(new Claim(ClaimTypes.Name, user.firstName)); 
      context.Validated(identity); 
     } 
     else 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 
    } 

} 

あなたは、私は、ユーザーが私は大丈夫だよ、この部分では、SPを呼び出すために、ストアドプロシージャとDapperのを呼び出すことによって、私のデータベースに存在するかどうかの認証にIUserAccountServiceを使用している見ることができるように。問題は、私は私のStartup.cs

public class Startup 
{ 
    internal IUserAccountService _userAccountService; 

    public void Configuration(IAppBuilder app) 
    {    
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

     var oAuthProvider = new OAuthServerProvider(_userAccountService); 

     OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/api/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = oAuthProvider 
     }; 
     app.UseOAuthAuthorizationServer(options); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

     HttpConfiguration config = new HttpConfiguration(); 
     WebApiConfig.Register(config); 
    } 
} 

でこのクラスをインスタンス化する必要があるとき、私は理由IUserAccountServiceのnullオブジェクト参照を取得しますが発生、私は、起動クラスのコンストラクタに注入しようとしたが、それはしません作業。

このプラクティスを実装する方法を知っていますか?

答えて

0

おそらく、IUserAccountServiceをリクエスト生涯有効範囲として定義しました。 このようにして、IUserAccountServiceはWebリクエストの開始時にインスタンス化されます。 Startup.Configuration()メソッドは、oauthサーバーが起動され、この時点でWeb要求がないときに実行されます。

私は同様の問題になったが、私は使用AutofacをしてOwinContextからAutofac寿命のスコープを取得し、それを解決:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    ... 
    // Get IUserService from AutofacLifetimeScope (e.g. 'AutofacWebRequest') 
    var autofacLifetimeScope = OwinContextExtensions.GetAutofacLifetimeScope(context.OwinContext); 
    var userService = autofacLifetimeScope.Resolve<IUserService>(); 
    ... 
} 

あなたがWeb要求寿命スコープからIUserServiceインスタンスを取得するこの方法です。

Unityと似たようなことができるかどうかわかりません。

私はそれが役に立ちそうです。

関連する問題