【问题标题】:Web Api 2 with OWIN OAuth Bearer tokens带有 OWIN OAuth Bearer 令牌的 Web Api 2
【发布时间】:2014-10-05 15:11:00
【问题描述】:

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

谁能指出我如何应用这种类型的身份验证而不必使用 Microsoft 身份框架的正确方向?

【问题讨论】:

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


【解决方案1】:

我想。不完全理解这个问题,但看起来你正在尝试不使用整个 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();
        }
...

【讨论】:

  • 感谢您的回复我基本上希望能够发行不记名令牌而不必使用 ASP.net 身份框架,主要问题是不必使用代码首先迁移并坚持使用我当前的如果有意义,DAL 会执行任何检查。
  • 看起来您不想使用 IdentityFramework 的 EF 实现,因为您已经拥有自己的表和 DAL。那么在这种情况下,上述两个(尤其是第一个)链接应该可以。我个人不喜欢使用 EF 附带的 IdentityFramework,而我(在某种程度上)无法完全控制它。所以我已经实现了这些接口并使用我自己的表和 DAL。
  • 是的,这也是我所追求的,完全控制总是获胜。在实施商店时,您是否必须实施所有这些商店,因为这对于我所追求的东西来说有点过头了。目前我想要的只是用户名和密码是否与我的数据库中的条目匹配,然后创建一个不记名令牌并使用它来授权对我的 api 的任何未来请求。
  • 您只需要实现您想要的商店,UserStore 是唯一必须做的。 RoleStore 听起来很可能适合您。即使这样,您也只需要实际实现您实际使用的方法。只需浏览您的用例,看看 UserManager 调用了哪些用例。
  • 您知道用于实现自定义存储并使用它为 webapi 生成不记名令牌的端到端示例/教程吗?上面的示例只是将当前表结构复制到 mySQL 数据库中,而我的与身份框架默认提供的完全不同
【解决方案2】:

我的建议是使用框架,但扩展它以使用您的对象和基础设施。我目前正在这样做并提出了这个问题。到目前为止,我是这样处理的:

第 1 步:您自己的自定义用户对象

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

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

第 2 步:定义您自己的 IUserStore 实现

添加一个实现 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 静态方法的第一行以使用新的存储和一个包装类,该类提供了一种“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 类,该类提供连接到提供用户数据的服务的方法,我仍在构建它):

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 对象编写实现,但一切都应该工作。

请注意,这不是样板代码,也没有“准备好进行代码审查”,正如我所说,我仍在深入研究并构建它以使用自定义存储、数据访问对象、服务等。我想你会从我花了几个小时才弄清楚的一些事情开始。当我有一个好的解决方案时,我会写博客。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复 您如何处理对数据库的 CRUD 操作?您是否使用默认的身份框架绑定和代码优先迁移?因为这是我不想使用的东西,因为我已经构建了自己的 EF,但我不确定在哪里用我自己的 DAL 替换现有的绑定。
  • 如果你有接口来处理你的 CRUD 操作,那么你可以将该接口传递给 CustomUserStore 对象的构造函数(编辑上面的帖子)。
  • 是的,这是有道理的。请您在创建博客后发布一个指向您的博客的链接,以供其他用户与这篇文章一起参考,再次感谢。
  • 当然,我会的。我应该在周末之前完成它:)
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2014-07-06
  • 2023-03-15
  • 1970-01-01
  • 2013-11-30
  • 2016-10-10
  • 2015-12-25
  • 1970-01-01
相关资源
最近更新 更多