0

Я изучаю, как работать с ASP.NET MVC Identity 2.0.Распаковка идентификатора ASP.NET MVC для аутентификации идентификатора OAuth

У меня есть этот код, который работает на OAuth Носителем

[HttpGet] 
    [ActionName("Authenticate")] 
    [AllowAnonymous] 
    public String Authenticate(string user, string password) 
    { 
     if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password)) 
     { 
      return "Failed"; 
     } 

     var userIdentity = UserManager.FindAsync(user, password).Result; 
     if (userIdentity != null) 
     { 
      if (User.Identity.IsAuthenticated) 
      { 
       return "Already authenticated!"; 
      } 

      var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType); 
      identity.AddClaim(new Claim(ClaimTypes.Name, user)); 
      identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userIdentity.Id)); 

      AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties()); 
      var currentUtc = new SystemClock().UtcNow; 
      ticket.Properties.IssuedUtc = currentUtc; 
      ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(1)); 

      string AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket); 
      return AccessToken; 
     } 
     return "Failed in the end"; 
    } 

Вот код для Startup.Auth.cs

//This will used the HTTP header Authorization: "Bearer 1234123412341234asdfasdfasdfasdf" 
    OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
    app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Я смотрел на исходный код для ClaimsIdentity и AuthenticationTicket и I не видите, как билет зарегистрирован для личности.

Вопрос: как этот билет зарегистрирован в трубопроводе Owin?

Моя цель - аннулировать этот билет, если это возможно.

Заранее спасибо.

ответ

0

Прежде всего, вот great tutorial on ASP.NET Identity 2 от Taiseer Joudeh.

Это линия, которая добавляет обработку токена-носителя в конвейер приложения OWIN.

app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Кроме того, вы сами сами пишете авторизационный провайдер? Мой код запуска выглядит так: то

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

PublicClientId = "self"; 
OAuthServerOptions = new OAuthAuthorizationServerOptions 
{ 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/Token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1440),  //TODO: change to smaller value in production, 15 minutes maybe 
    Provider = new SimpleAuthorizationServerProvider(PublicClientId), 
    RefreshTokenProvider = new SimpleRefreshTokenProvider() 
}; 

app.UseOAuthAuthorizationServer(OAuthServerOptions); 

OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Мой SimpleAuthorizationServerProvider имеет метод Grant так:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin") ?? "*"; 

    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

    ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

    if (user == null) 
    { 
     context.SetError("invalid_grant", "The user name or password is incorrect."); 
     return; 
    } 

    var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())); 
    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
    identity.AddClaim(new Claim("sub", context.UserName)); 

    foreach (var role in userManager.GetRoles(user.Id)) 
    { 
     identity.AddClaim(new Claim(ClaimTypes.Role, role)); 
    } 

    var props = new AuthenticationProperties(new Dictionary<string, string> 
    { 
     {"as:client_id", context.ClientId ?? string.Empty} 
    }); 

    var ticket = new AuthenticationTicket(identity, props); 
    context.Validated(ticket); 
} 

Почти все это было на основе учебника, упомянутой выше. Надеюсь, поможет.

Update Там нет стандартного способа отменить маркер в соответствии с Taiseer on this page.

Аннулирования доступа с проверкой подлинности пользователей: После того, как пользователь получает долгоживущий маркер доступа, он будет иметь возможность получить доступ к ресурсам серверов до тех пор, как его маркер доступа не истекло, нет стандартного способа в аннулировать токены доступа, если на сервере авторизации реализована пользовательская логика , которая заставляет вас хранить сгенерированный токен доступа в базе данных и выполнять проверку базы данных с каждым запросом. Но с обновлением токенов системный администратор может отменить доступ, просто удалив идентификатор токена из базы данных, поэтому, как только система запросит новый токен доступа с помощью удаленного токена обновления, сервер авторизации отклонит этот запрос, поскольку токен обновления больше нет (мы придем к этому с более подробной информацией).

Однако here is an interesting approach, который может выполнить то, что вам нужно. Это просто займет немного пользовательской реализации.

+0

Благодарим вас за ответ. Да, я изучил учебник Тайсера, и это очень хорошо. Код, который я опубликовал, работает одинаково. Что я хотел бы знать, есть ли способ отменить билет? – superfly71

+0

@ superfly71 Я обновил сообщение. Я думаю, вам нужно реализовать токены обновления, чтобы выполнить то, что вы хотите. – BBauer42

+0

Я фактически принял черный список, как указано в ссылке, которую вы предоставили. Я просто надеялся на лучший подход. В любом случае, благодарю Вас! – superfly71