繁体   English   中英

存储库模式项目中基于令牌的认证

[英]Token based authentication in repository pattern project

我已经基于存储库模式创建了一个项目。 并使用本教程在此处实现基于令牌的身份验证教程链接

这是我的代码:

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进行依赖项注入。

我的示例项目在我的github仓库中

任何建议都会有所帮助,谢谢。

更新#1:

我尝试使用IDisposable仍然会收到此错误,请参阅更新的Authenticator.cs代码。 (github中的TokenAuthIssue / AuthSO.Core / Manager / 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继承。 当您使用using'using'IDisposable时,请确保它可以在using范围结束后从using语句中处置该变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM