Asp.net web api 带有OWIN OAuth承载令牌的Web Api 2

Asp.net web api 带有OWIN OAuth承载令牌的Web Api 2,asp.net-web-api,oauth,asp.net-identity,owin,Asp.net Web Api,Oauth,Asp.net Identity,Owin,我正在visual studio 2013中构建web api,希望使用OWIN中间件和承载令牌进行身份验证。然而,我已经有了一个数据库,不想使用微软的新身份框架,因为它自动生成的大多数表和列我根本不需要 有人能告诉我如何在不必使用Microsoft Identity framework的情况下应用这种类型的身份验证的正确方向吗。不完全理解这个问题,但看起来你是在试图摆脱整个owin管道 如果没有,那么 您需要实现几个与用户和角色相关的界面,如下所述 请看下面斯科特·艾伦的帖子 通过这种方式

我正在visual studio 2013中构建web api,希望使用OWIN中间件和承载令牌进行身份验证。然而,我已经有了一个数据库,不想使用微软的新身份框架,因为它自动生成的大多数表和列我根本不需要


有人能告诉我如何在不必使用Microsoft Identity framework的情况下应用这种类型的身份验证的正确方向吗。不完全理解这个问题,但看起来你是在试图摆脱整个owin管道

如果没有,那么

您需要实现几个与用户和角色相关的界面,如下所述

请看下面斯科特·艾伦的帖子

通过这种方式,您可以使用自己的表、DAL和服务来创建UserManager和RoleManager对象

编辑:上面的示例应该给你一些提示

Edit2:自定义用户存储示例。 IRepository是处理积垢的对象

    public class CustomUserStore : IUserStore<User>,....
    {
        private readonly IRepository _repository;
        public CustomUserStore(IRepository repository)
        {
            if (repository == null)
                throw new ArgumentNullException("repository");
            _repository = repository;
        }
        public Task CreateAsync(User user)
        {
            if (user == null) throw new ArgumentException("user");
            _repository.User.Add(user);
            return _repository.CommitAsync();
        }
...
公共类CustomUserStore:IUserStore,。。。。
{
专用只读IRepository存储库;
公共CustomUserStore(IRepository存储库)
{
if(存储库==null)
抛出新的ArgumentNullException(“存储库”);
_存储库=存储库;
}
公共任务CreateAsync(用户)
{
如果(user==null)抛出新的ArgumentException(“user”);
_repository.User.Add(用户);
返回_repository.CommitAsync();
}
...

我的建议是使用这个框架,但是扩展它来使用你的对象和基础设施。我现在正处于这样做的中间,登陆这个问题。这里我是如何处理它的:

步骤1:您自己的CustomUserObject

编写/使用您自己的“ApplicationUser”对象。在模板项目中,您希望修改“IdentityModels”文件。该文件中定义了ApplicationUser对象。假设您已经拥有现有应用程序的所有属性,则需要添加GenerateUserIdentityAsync()方法,但将参数的类型更改为UserManager)。更改后,您的方法签名如下所示:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<CustomUserObject> manager)
步骤4:更改ApplicationDbContext类以返回UserManagementServiceWrapper实例

public class ApplicationDbContext : UserManagementServiceWrapper
{
    public static UserManagementServiceWrapper Create()
    {
        return new UserManagementServiceWrapper();
    }
}
基本上就是这样。您仍然需要为CustomUserStore对象编写实现,但一切都应该正常

请注意,这不是样板代码,在“代码审阅就绪”附近没有,正如我所说的,我仍在深入研究这个问题,并构建它以使用自定义存储、数据访问对象、服务等。我想你会从我花了几个小时才弄明白的一些事情中得到一个好的开始。当我有了一个好的解决方案时,我会在博客上对此进行讨论


希望这有帮助。

感谢您的回复,我基本上希望能够在不必使用ASP.net Identity framework的情况下发行承载令牌,主要问题是不必使用代码优先迁移,并且坚持使用我当前的DAL来执行任何检查(如果有意义)。看起来您不想使用IdentityFramework的EF impleme声明,因为你已经有了自己的表和DAL。在这种情况下,上面两个(特别是第一个)链接就可以了。我个人不喜欢使用IDENTITY框架,因为它附带了EF,而我不喜欢(某种程度上)完全控制。所以我已经实现了这些接口,并使用了我自己的表和DAL。是的,这就是我所追求的,而且完全控制总是赢。当实现存储时,你是否必须实现所有这些,因为这对我所追求的有点过分。目前我想要的是用户名和密码是否与我数据库中的条目匹配然后创建一个承载令牌,并使用它来授权将来对我的api的任何请求。你只需要实现你想要的存储,UserStore是唯一必须做的。RoleStore听起来对你来说很可能。即使这样,你也只需实实在在地实现你实际使用的方法。只需浏览一下你的用例,看看哪些是你想要的serManager调用。您知道实现自定义存储并使用它为webapi生成承载令牌的端到端示例/教程吗。上面的示例只是将当前表结构复制到mySQL数据库中,其中我的表结构与DefaultIdentity框架提供的完全不同谢谢您的回复y怎么样您是否正在处理对数据库的CRUD操作?您是否正在使用默认的Identity framework绑定和代码优先迁移?因为这是我不想使用的,因为我已经构建了自己的EF,但我不确定在何处使用自己的DAL替换现有绑定。如果您有处理CRUD操作的对象接口,然后可以将该接口传递给CustomUserStore对象的构造函数(编辑了上面的帖子)。是的,好的,这很有意义。当你创建了你的博客供其他用户参考时,请你在博客上发布一个链接,再次感谢。当然,我会的。我应该在周末之前完成:)这是我在另一个帖子上发布的对这个问题的回答:
    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<UserManagementServiceWrapper>()));
        //modify the relevant lines after this to suit your needs
        ...
    }
public class UserManagementServiceWrapper : UserManagementService, IDisposable
{
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}
public class ApplicationDbContext : UserManagementServiceWrapper
{
    public static UserManagementServiceWrapper Create()
    {
        return new UserManagementServiceWrapper();
    }
}