Bạn nói:
I want to implement a login/registration system (so that I can implement roles and permissions in the future, and restrict certain API requests).
How do I setup authentication in a Web API 2 application, having an existing user entity?
Nó chắc chắn có nghĩa là bạn KHÔNG cần ASP.NET Identity. ASP.NET Identity là một công nghệ để xử lý tất cả các chất liệu của người dùng. Nó thực sự không "làm" cơ chế xác thực. ASP.NET Identity sử dụng cơ chế xác thực OWIN, đó là một thứ khác.
gì bạn đang tìm kiếm không phải là "làm thế nào để sử dụng ASP.NET nhận dạng với bàn của tôi hiện có người dùng", nhưng "Làm thế nào để cấu hình OWIN xác thực sử dụng bảng Người dùng hiện tại của tôi"
Để sử dụng OWIN Auth làm theo các bước sau:
Cài đặt các gói:
Owin
Microsoft.AspNet.Cors
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.Owin
Microsoft.AspNet.WebApi.WebHost
Microsoft.Owin
Microsoft.Owin.Host.SystemWeb
Microsoft.Owin.Security
Microsoft.Owin.Security.OAuth
Tạo Startup.cs
tập tin bên trong thư mục gốc (examp le):
chắc chắn rằng [assembly: OwinStartup] được cấu hình đúng
[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");
}
}
}
}
Sử dụng [Authorize]
thuộc tính cho phép các hành động.
Gọi api/security/token
với GrantType
, UserName
và Password
để nhận mã thông báo mang. Như thế này:
"grant_type=password&username=" + username + "&password=" password;
Gửi token trong HttpHeader Authorization
như Bearer "YOURTOKENHERE"
. Như thế này:
headers: { 'Authorization': 'Bearer ' + token }
Hy vọng điều đó sẽ hữu ích!
Cảm ơn, đây là những gì tôi đang tìm kiếm. Xin lỗi nếu câu hỏi của tôi là không rõ ràng, nhưng tôi đã nhầm lẫn bởi "vai trò" của ASP.NET Identity. –
Bạn là người bạn đời thân thiết. Nếu bạn gặp khó khăn trong quá trình thực hiện, đừng ngần ngại bình luận ở đây –
Xin chào, bạn có thể cho tôi biết đối tượng userService trong mã của bạn ở trên không? Chỉ cần một đối tượng lớp tùy chỉnh mà sẽ kết nối với bối cảnh DB của tôi và trả lại người dùng tùy chỉnh của tôi từ DB? Người dùng không phải kế thừa sau IUser hay bất cứ thứ gì? – Savail