你说:
我想实现一个登录/注册系统(这样我就可以
未来实现角色和权限,并限制某些
API 请求)。
如何在 Web API 2 应用程序中设置身份验证,具有
现有用户实体?
这绝对意味着您不需要需要 ASP.NET Identity。 ASP.NET Identity 是一种处理所有用户资料的技术。它实际上并没有“制作”身份验证机制。 ASP.NET Identity 使用 OWIN 身份验证机制,这是另一回事。
您要查找的不是“如何将 ASP.NET Identity 与我现有的 Users 表一起使用”,而是 “如何使用我现有的 Users 表配置 OWIN 身份验证”强>
要使用 OWIN 身份验证,请按以下步骤操作:
安装包:
Owin
Microsoft.AspNet.Cors
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.Owin
Microsoft.AspNet.WebApi.WebHost
Microsoft.Owin
Microsoft.Owin.Cors
Microsoft.Owin.Host.SystemWeb
Microsoft.Owin.Security
Microsoft.Owin.Security.OAuth
在根文件夹内创建Startup.cs文件(示例):
确保 [assembly: OwinStartup] 配置正确
[assembly: OwinStartup(typeof(YourProject.Startup))]
namespace YourProject
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
//other configurations
ConfigureOAuth(app);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/api/security/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(2),
Provider = new AuthorizationServerProvider()
};
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
public class AuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
try
{
//retrieve your user from database. ex:
var user = await userService.Authenticate(context.UserName, context.Password);
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, user.Name));
identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));
//roles example
var rolesTechnicalNamesUser = new List<string>();
if (user.Roles != null)
{
rolesTechnicalNamesUser = user.Roles.Select(x => x.TechnicalName).ToList();
foreach (var role in user.Roles)
identity.AddClaim(new Claim(ClaimTypes.Role, role.TechnicalName));
}
var principal = new GenericPrincipal(identity, rolesTechnicalNamesUser.ToArray());
Thread.CurrentPrincipal = principal;
context.Validated(identity);
}
catch (Exception ex)
{
context.SetError("invalid_grant", "message");
}
}
}
}
使用[Authorize] 属性来授权操作。
使用GrantType、UserName 和Password 调用api/security/token 以获取不记名令牌。像这样:
"grant_type=password&username=" + username + "&password=" password;
将HttpHeader Authorization 中的令牌作为Bearer "YOURTOKENHERE" 发送。像这样:
headers: { 'Authorization': 'Bearer ' + token }
希望对你有帮助!