Ответ 1
Вы говорите:
Я хочу внедрить систему регистрации/регистрации (чтобы я мог выполнять роли и разрешения в будущем и ограничивать определенные API).
Как настроить аутентификацию в приложении Web API 2, имея существующий пользовательский объект?
Это определенно означает, что вам требуется НЕ идентификатор ASP.NET. ASP.NET Identity - это технология обработки всех продуктов пользователей. Он фактически не "делает" механизм аутентификации. Идентификатор ASP.NET использует механизм аутентификации OWIN, что является другой вещью.
То, что вы ищете, не , как использовать идентификатор ASP.NET с моей существующей таблицей ", но ". Как настроить аутентификацию OWIN с помощью моей таблицы "Существующие пользователи"
Чтобы использовать OWIN Auth, выполните следующие действия:
Установите пакеты:
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
Создайте файл Startup.cs
внутри корневой папки (пример):
убедитесь, что [сборка: 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]
для авторизации действий.
Вызовите api/security/token
с помощью GrantType
, UserName
и Password
, чтобы получить токен-носитель. Вот так:
"grant_type=password&username=" + username + "&password=" password;
Отправьте токен в HttpHeader Authorization
как Bearer "YOURTOKENHERE"
. Вот так:
headers: { 'Authorization': 'Bearer ' + token }
Надеюсь, что это поможет!