带有OWIN OAuth承载令牌的Web Api 2

时间:2014-08-12 13:56:04

标签: asp.net-web-api oauth asp.net-identity owin

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

有人能指出我如何应用此类身份验证的正确方向,而不必使用Microsoft身份框架吗?

2 个答案:

答案 0 :(得分:2)

我知道。不完全理解这个问题,但看起来你似乎没有整个owin管道吗?

如果不是那么..

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

http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity

查看Scott Allen的以下帖子

http://odetocode.com/blogs/scott/archive/2013/11/25/asp-net-core-identity.aspx

这样您就可以使用自己的表,DAL和服务来创建UserManager和RoleManager对象。

编辑:here以上的示例应该给你一些指示。

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

    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();
        }
...

答案 1 :(得分:2)

我的建议是使用框架,但扩展它以使用您的对象和基础结构。我目前正在做这件事并着手解决这个问题。到目前为止,我已经解决了这个问题:

第1步:您自己的CustomUserObject

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

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<CustomUserObject> manager)

第2步:定义自己的IUserStore&lt;&gt;实施

添加一个实现IUserStore的新类CustomUserStore,如下所示:

public class CustomUserStore : IUserStore<CustomUserObject>
{
    private readonly IUserManagerService _userManagerService;
    public CustomUserStore(IUserManagerService userManagerService)
    {
        _userManagerService = userManagerService
    }

    //implementation code for all of the IUserStore methods here using
    //userManagerService or your existing services/classes
}

我正在使用Unity注入上面的IUserManagementService实现。

我已经使用了Microsoft Identity框架附带的综合UserManager类,但扩展了框架以使用我的API进行身份验证和授权。您可以编写自己的UserManager,但我发现它非常繁琐,并且没有理由说UserManager可以用于大多数保护应用程序的情况。

步骤3:IdentityConfig.cs文件中的更改

更改类定义以使ApplicationUserManager类继承自UserManager

你也需要在这个类的构造函数中做同样的事情;即拥有IUserStore。修改Create static方法的第一行以使用新的存储和一个包装类,它提供了一个像“DbContext”那样的方法:

    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
        ...
    }

我的UserManagementServiceWrapper看起来像这样(请注意,我不太高兴它继承自具体的UserManagementService类,该类提供连接到提供用户数据的服务的方法,我仍在构建它):< / p>

public class UserManagementServiceWrapper : UserManagementService, IDisposable
{
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

步骤4:更改ApplicationDbContext类以返回UserManagementServiceWrapper实例

public class ApplicationDbContext : UserManagementServiceWrapper
{
    public static UserManagementServiceWrapper Create()
    {
        return new UserManagementServiceWrapper();
    }
}

这就是它。您仍然必须为CustomUserStore对象编写实现,但一切都应该有效。

请注意,这不是样板代码,并且没有“代码审查准备就绪”附近,正如我所说的,我仍在深入研究并构建它以使用自定义商店,数据访问对象,服务等。我想你会得到一些好的开始,这些事情花了我几个小时来弄明白。当我有一个很好的解决方案时,我会在博客上发表这篇文章。

希望这有帮助。