Tu dici:
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?
Significa sicuramente che si DO NOT bisogno di ASP.NET Identità. ASP.NET Identity è una tecnologia per gestire tutti gli elementi degli utenti. In realtà non "crea" il meccanismo di autenticazione. L'identità di ASP.NET utilizza il meccanismo di autenticazione OWIN, che è un'altra cosa.
Quello che state cercando non è "come utilizzare ASP.NET identità con la mia tabella esistente Users", ma "Come configurare l'autenticazione OWIN usando la mia tabella utenti esistenti"
Per utilizzare OWIN auth attenersi alla seguente procedura:
installare i pacchetti:
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
Creare Startup.cs
di file all'interno della cartella principale (examp le):
assicurarsi che [assembly: OwinStartup] sia configurato correttamente
[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");
}
}
}
}
Utilizzare l'attributo [Authorize]
per autorizzare le azioni.
chiamata api/security/token
con GrantType
, UserName
, e Password
per ottenere il token portatore. Come questo:
"grant_type=password&username=" + username + "&password=" password;
Invia il token all'interno del HttpHeader Authorization
come Bearer "YOURTOKENHERE"
. Come questo:
headers: { 'Authorization': 'Bearer ' + token }
Spero che aiuti!
Grazie, questo è quello che stavo cercando. Scusa se la mia domanda non è chiara, ma sono stato confuso dal "ruolo" di ASP.NET Identity. –
Sei il benvenuto amico. Se hai problemi nell'implementazione, non esitare a commentare qui –
Ehi, potresti dirmi quale sarebbe l'oggetto userService nel tuo codice sopra? Solo un oggetto di classe personalizzato che si connetterebbe al mio DB Contesto e restituire il mio Utente personalizzato dal DB? L'utente non deve ereditare dopo IUser o qualcosa del genere? – Savail