Aitzaz Ahsan Ответов: 0

Войдите в систему с помощью веб-API, используя аутентификацию на основе токенов(JWT). В ASP.NET MVC


Это мой класс statrup

public partial class Startup
   {
       public void Configuration(IAppBuilder app)
       {
           HttpConfiguration config = new HttpConfiguration();
           ConfigureOAuth(app);
           WebApiConfig.Register(config);
           app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
           app.UseWebApi(config);
       }

       //private void ConfigureAuth(IAppBuilder app)
       //{
       //    throw new NotImplementedException();
       //}

       public void ConfigureOAuth(IAppBuilder app)
       {
           OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
           {
               AllowInsecureHttp = true,
               TokenEndpointPath = new PathString("/token"),
               AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
               Provider = new SimpleAuthorizationServerProvider()
           };

           // Token Generation
           app.UseOAuthAuthorizationServer(OAuthServerOptions);
           app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

       }
   }

Это мой класс AuthRepositry
public class AuthRepository : IDisposable
   {
       private MobileAppEntities _ctx;
       private UserManager<ApplicationUser> _userManager;// UserManager { get { return _userManager; } private set { } }
       public AuthRepository()
       {
           _ctx = new MobileAppEntities();
           _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(_ctx));
       }
       public async Task<IdentityUser> FindUser(string userName, string password)
       {
           IdentityUser user = await _userManager.FindAsync(userName, password);
           return user;
       }
       public void Dispose()
       {
           _ctx.Dispose();
           _userManager.Dispose();
       }
   }


Это один класс поставщика сервера авторизации
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
   {
       private ApplicationUserManager _userManager;
       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[] { "*" });

           using (AuthRepository _repo = new AuthRepository())
           {
               IdentityUser user = await _repo.FindUser(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("sub", context.UserName));
           identity.AddClaim(new Claim("role", "user"));

           context.Validated(identity);

       }
   }


Что я уже пробовал:

Каждый раз, когда я отправляю запрос от почтальона, он выдает такую ошибку
Ошибка
{
"ошибки": "unsupported_grant_type"
}

Vincent Maverick Durano

Можешь показать нам свой локон, который ты использовал в "почтальоне"?

Aitzaz Ahsan

вы можете увидеть мой запрос почтальона по ссылке
https://ibb.co/pz9ZZ0k

Richard Deeming

Ошибка в снимке экрана не соответствует ошибке в вашем вопросе.

Vincent Maverick Durano

Как уже упоминалось, ошибка отличалась от первоначального вопроса. Что касается ошибки в ссылке, то она, похоже, ваша user объект есть null Проверьте имя пользователя и пароль, отладив свой код.

0 Ответов