问题描述
在默认的AccountController创建我看
In the default AccountController created I see
public AccountController()
: this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
{
}
在Startup.Auth.cs我看
In Startup.Auth.cs I see
UserManagerFactory = () =>
new UserManager<IdentityUser>(new UserStore<IdentityUser>());
好像实施 UserStore 来自 Microsoft.AspNet.Identity.EntityFramework 。
所以,定制验证我需要实现我自己UserStore版本像
So, to customize the authentication do I have to implement my own version of UserStore like
class MYSTUFFUserStore<IdentityUser> : UserStore<IdentityUser>
{
}
和重载的方法,然后为此在Startup.Auth.cs
and override the methods and then do this in Startup.Auth.cs
UserManagerFactory = () =>
new UserManager<IdentityUser>(new MYSTUFFUserStore<IdentityUser>());
我要寻找定制验证的正确道路。
I am looking for a correct way to customize the authentication.
推荐答案
假设你的表称为 APPUSER
,将您自己的 APPUSER
域对象为 IUSER(使用Microsoft.AspNet.Identity)
像这样
Assuming your table is called AppUser
, convert your own AppUser
domain object to IUser(using Microsoft.AspNet.Identity)
like this
using Microsoft.AspNet.Identity;
public class AppUser : IUser
{
//Existing database fields
public long AppUserId { get; set; }
public string AppUserName { get; set; }
public string AppPassword { get; set; }
public AppUser()
{
this.Id = Guid.NewGuid().ToString();
}
[Ignore]
public virtual string Id { get; set; }
[Ignore]
public string UserName
{
get
{
return AppUserName;
}
set
{
AppUserName = value;
}
}
}
实施这样的 UserStore
对象
using Microsoft.AspNet.Identity;
public class UserStoreService
: IUserStore<AppUser>, IUserPasswordStore<AppUser>
{
CompanyDbContext context = new CompanyDbContext();
public Task CreateAsync(AppUser user)
{
throw new NotImplementedException();
}
public Task DeleteAsync(AppUser user)
{
throw new NotImplementedException();
}
public Task<AppUser> FindByIdAsync(string userId)
{
throw new NotImplementedException();
}
public Task<AppUser> FindByNameAsync(string userName)
{
Task<AppUser> task = context.AppUsers.Where(
apu => apu.AppUserName == userName)
.FirstOrDefaultAsync();
return task;
}
public Task UpdateAsync(AppUser user)
{
throw new NotImplementedException();
}
public void Dispose()
{
context.Dispose();
}
public Task<string> GetPasswordHashAsync(AppUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
return Task.FromResult(user.AppPassword);
}
public Task<bool> HasPasswordAsync(AppUser user)
{
return Task.FromResult(user.AppPassword != null);
}
public Task SetPasswordHashAsync(AppUser user, string passwordHash)
{
throw new NotImplementedException();
}
}
如果你有自己的自定义密码散列你还需要实现 IPasswordHasher
。下面是在没有密码的散列一个例子(哦不!)
If you have your own custom password hashing you will also need to implement IPasswordHasher
. Below is an example where there is no hashing of the password(Oh no!)
using Microsoft.AspNet.Identity;
public class MyPasswordHasher : IPasswordHasher
{
public string HashPassword(string password)
{
return password;
}
public PasswordVerificationResult VerifyHashedPassword
(string hashedPassword, string providedPassword)
{
if (hashedPassword == HashPassword(providedPassword))
return PasswordVerificationResult.Success;
else
return PasswordVerificationResult.Failed;
}
}
在Startup.Auth.cs替换
In Startup.Auth.cs replace
UserManagerFactory = () =>
new UserManager<IdentityUser>(new UserStore<IdentityUser>());
与
UserManagerFactory = () =>
new UserManager<AppUser>(new UserStoreService()) { PasswordHasher = new MyPasswordHasher() };
在 ApplicationOAuthProvider.cs
替换 IdentityUser
与 APPUSER
在 AccountController.cs
替换 IdentityUser
与 APPUSER
并删除所有的外部身份验证方法,如 GetManageInfo
和 RegisterExternal
等。
In AccountController.cs
, replace IdentityUser
with AppUser
and delete all the external authentication methods like GetManageInfo
and RegisterExternal
etc.
这篇关于如何自定义验证我自己的一套在asp.net网页API 2表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!