私はリポジトリパターンに基づいてプロジェクトを作成しました。このチュートリアルでは、トークンベースの認証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);
}
}
}
問題:
どのように私はこの問題を解決することができます。私は依存性注入のためにAutofacを使用しています。
My sample project with this issue is in my github repo
何かアドバイスが参考になる、ありがとうございます。
更新#1:
私はまだ私は、このエラーを取得しますIDisposableインターを使用してみました、更新Authenticator.csコードを参照してください。 (githubの中TokenAuthIssue/AuthSO.Core /マネージャー/ Authenticator.cs)
更新#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>
これは明らかに依存性注入の問題です。私を解決策に導いてください。
IAuthenticatorはIDisposableを実装していますか? IAuthenticatorクラスを投稿できますか? –
エラーはかなり明確で、リポジトリのパターンや認証とは無関係です。 * IDisposableインターフェイスを実装していないクラスを使用しようとしました。 'using(...)'ステートメントは 'IDisposable.Dispose()'を呼び出すための文法的な砂糖です。 –
私の更新された質問を参照してください、私はIAuthenticator.csとIDisposableを追加しました。 –