Web API 2 OWIN Токен на предъявителя

1

Я хочу реализовать свою собственную аутентификацию по WebApi. Я пытаюсь изменить метод GrantResourceOwnerCredentials в ApplicationOAuthProvider.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        using (UserManager<IdentityUser> userManager = _userManagerFactory())
        {
            IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

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

            ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
                context.Options.AuthenticationType);
            ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
                CookieAuthenticationDefaults.AuthenticationType);
            AuthenticationProperties properties = CreateProperties(user.UserName);
            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }
    }

Я заменяю аутентификацию:

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

с моим вызовом веб-службы, который возвращает true для аутентификации и false для не аутентифицированного.

if (authenticated)
{
IdentityUser user = new IdentityUser("username");
}

Но я не знаю, как действовать с ClaimsIdentity. У кого есть образцы, на которые я могу ссылаться? Благодарю.

Теги:
authentication
asp.net-web-api
owin

2 ответа

1

В конце этого, но может также документировать его, поскольку он все еще имеет значение. Если вы имеете в виду, как вы назначаете и разрешаете претензии из билета, у вас есть варианты. Вы можете либо реализовать IUserClaimsStore (документацию для указанного объекта), либо просто создать свою собственную службу хранения заявок. Самый ручной метод заключается в том, чтобы приписывать претензии пользователю явно после проверки их входа и получения их личности. Вот простой пример использования вашего кода:

using (UserManager<IdentityUser> userManager = _userManagerFactory())
    {
        IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

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

        user.AddClaim(new Claim("sub","whateveryouwantthesubjectnametobe"));
        user.AddClaim(new Claim("someotherclaim","whosecontentsyoudeterminehoweveryouwouldlike"));

        ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
            context.Options.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
            CookieAuthenticationDefaults.AuthenticationType);
        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }

Должно быть, претензии будут частью вашего токена, и он должен автоматически заполнить ClaimsPrincipal при следующем запросе. Если вы хотите просмотреть десериализацию билета по запросу, создайте простую реализацию OAuthBearerAuthenticationProvider и переопределите метод ValidateIdentity:

private class SuperSecretBearerAuthClass: OAuthBearerAuthenticationProvider
    {
        public override Task ValidateIdentity(OAuthValidateIdentityContext context)
        {
            var claims = context.Ticket.Identity.Claims; //examine claims here
            base.ValidateIdentity(context);
            return Task.FromResult<object>(null);
        }
    }

Регистрация в startup.cs/везде, где вы настраиваете свой auth, будет выглядеть так:

 app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
 {
       Provider = new SuperSecretBearerAuthClass()

  });
0

Я действительно не понимаю, что вы ищете, но вы можете взглянуть на реализацию Thinktectures встроенного сервера OAuth.

Проверьте проект Thinktecture.IdentityModel и образцы - https://github.com/thinktecture/Thinktecture.IdentityModel

У них есть пример проекта под названием samples\OAuth2\EmbeddedAuthorizationServer, который использует метод GrantResourceOwnerCredentials для аутентификации.

Здесь есть простая запись в блоге ClaimsIdentity, которая также может помочь. http://www.remondo.net/simple-claims-based-identity/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню