带有OWIN OAuth载体令牌的Web Api 2
我正在使用Visual Studio 2013构建Web API,并希望使用OWIN中间件和承载令牌进行身份验证。 然而,我已经有了一个数据库,并且不希望使用微软的新的Identity框架,因为它自动生成的大多数表和列是我不需要的。
任何人都可以指出我如何应用这种认证的正确方向, 而无需使用Microsoft Identity框架?
我的建议是使用框架,但扩展它来使用你的对象和基础设施。 我目前正在做这件事,并着手解决这个问题。 以下是迄今为止我已经解决的问题:
第1步:您自己的CustomUserObject
编写/使用您自己的“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 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类,它提供了连接到提供用户数据的服务的方法,我仍然在构建这个):
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对象的实现,但一切都应该工作。
请注意,这不是代码样板代码,并且没有接近“代码审查就绪”的地方,正如我所说的,我仍在深入挖掘并构建它以使用定制商店,数据访问对象和服务等。我认为您会用我花了几个小时弄清楚的一些事情开始了一个好的开始。 当我有一个好的解决方案时,我会对此进行博客。
希望这可以帮助。
我概率。 不完全理解这个问题,但它看起来像你试图做的没有整个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对象。
编辑:这里的示例应该给你一些指示。
编辑2:自定义用户存储示例。 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();
}
...
链接地址: http://www.djcxy.com/p/22417.html