2017-04-07 18 views
0

私はリポジトリパターンに基づいてプロジェクトを作成しました。このチュートリアルでは、トークンベースの認証Tutorial Link hereを実装しました。リポジトリパターンプロジェクトのトークンベース認証

ここに私のコードだ:

ValuesController.cs

public IHttpActionResult GetAuth(string Username, string Password) 
    { 
     return Ok(_au.Authenticate(Username, Password)); //returns true or false 
    } 

IAuthenticator.cs

namespace AuthSO.Core.Interface 
{ 
    public interface IAuthenticator:IDisposable 
    { 
     bool Authenticate(string Username, string Password); 
    } 
} 

Authenticator.cs

namespace AuthSO.Core.Manager 
{ 
    public class Authenticator : IAuthenticator, IDisposable 
    { 
     public IGetData _get; 
     public Authenticator(IGetData _get) 
     { 
      this._get = _get; 
     } 
     public bool Authenticate(string Username, string Password) 
     { 
      return _get.Authenticate(Username, Password); 
     } 
     public void Dispose() 
     { 
      //left empty here, nothing to dispose here i guess 
     } 
    } 
} 

AuthenticatorProvider.cs

namespace AuthSO.API.Provider 
{ 
    public class AuthenticatorProvider : 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 (IAuthenticator _auth = new Authenticator()) //I'm getting an error here 
      { 
       bool result = _auth.Authenticate(context.UserName, context.Password); 

       if (!result) 
       { 
        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")); 

      context.Validated(identity); 

     } 
    } 
} 

問題:

enter image description here

どのように私はこの問題を解決することができます。私は依存性注入のためにAutofacを使用しています。

My sample project with this issue is in my github repo

何かアドバイスが参考になる、ありがとうございます。

更新#1:

私はまだ私は、このエラーを取得しますIDisposableインターを使用してみました、更新Authenticator.csコードを参照してください。 (githubの中TokenAuthIssue/AuthSO.Core /マネージャー/ Authenticator.cs)

enter image description here

更新#2:

私はこの

using (IAuthenticator _auth = new Authenticator(new GetData())) 

を使用してみましたが、再び、私はエラー

を得ました
<Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
An error occurred when trying to create a controller of type 'ValuesController'. Make sure that the controller has a parameterless public constructor. 
</ExceptionMessage> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<StackTrace> 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() 
</StackTrace> 
<InnerException> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
Type 'AuthSO.API.Controllers.ValuesController' does not have a default constructor 
</ExceptionMessage> 
<ExceptionType>System.ArgumentException</ExceptionType> 
<StackTrace> 
at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
</StackTrace> 
</InnerException> 
</Error> 

これは明らかに依存性注入の問題です。私を解決策に導いてください。

+0

IAuthenticatorはIDisposableを実装していますか? IAuthenticatorクラスを投稿できますか? –

+0

エラーはかなり明確で、リポジトリのパターンや認証とは無関係です。 * IDisposableインターフェイスを実装していないクラスを使用しようとしました。 'using(...)'ステートメントは 'IDisposable.Dispose()'を呼び出すための文法的な砂糖です。 –

+0

私の更新された質問を参照してください、私はIAuthenticator.csとIDisposableを追加しました。 –

答えて

1

IAuthenticatorがIDisposableから継承していないように見えます。 IDisposableを使用すると、使用スコープが終了した後にusingステートメントから変数を破棄できることが確認されます。

関連する問題