Веб-API и мобильный API с токеном на предъявителя

#asp.net #authorization #owin #bearer-token

#asp.net #авторизация #owin #токен на предъявителя

Вопрос:

Мы создаем сервер для веб-Api и мобильного Api, используя токен на предъявителя с OWIN. Требования к проверке у этих двух разные.

Это конфигурация Owin:

     public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
        ConfigureOAuth(app);
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            TokenEndpointPath = new PathString("/Api/Token"),
            Provider = new ApplicationOAuthProvider(),
            // RefreshTokenProvider = new ApplicationRefreshTokenProvider(),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(8),
            AllowInsecureHttp = true,
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthServerOptions);

        OAuthAuthorizationServerOptions mobOAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            TokenEndpointPath = new PathString("/Mobile/Token"),
            Provider = new MobileOAuthProvider(),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
            AllowInsecureHttp = true,
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(mobOAuthServerOptions);
    }
  

Это маршрутизация:

 public class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "Api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "MobileApi",
            routeTemplate: "Mobile/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Ignore any authentication that happens before the request reaches the Web Api pipeline, either by IIS or OWIN middleware.
        // That way to restrict Web Api to authenticate only using bearer tokens.
        config.SuppressDefaultHostAuthentication();

        // enable authentication using bearer tokens.
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // configuration.Filters.Add(new TokenValidationAttribute());
    }
}
  

Контроллер для API:

 [Authorize]
public class EmployeeLeaveBalanceController : ApiBaseController
{
    public EmployeeLeaveBalanceController()
        : base()
    { }

    [System.Web.Http.HttpGet]
    public ApiResult GetLeaveBalance([FromUri] string payrollName, [FromUri] string employeeNumber)
    {
        try
        {
            SetContext(null);

            ApiResult result = ValidateParameter(payrollName);
            if (result != null)
                return resu<

            EmployeeLeaveBalanceModel model = new EmployeeLeaveBalanceModel();
            return model.GetLeaveBalance(payrollName, employeeNumber);
        }
        catch //(Exception)
        {
            return new ApiResult().SetMessage(ApiResultMessage.UnexceptedError);
        }
    }

    private ApiResult ValidateParameter(string payrollName)
    {
        bool isValid = UploadHelper.GetPayroll(payrollName) != null;

        return (!isValid)
            ? new ApiResult().SetMessage(ApiResultMessage.InvalidParameter)
            : null;
    }
}
  

Для мобильного API

 [Authorize]
public class UserController : MobileBaseController
{
    #region Get
    [System.Web.Http.HttpGet]
    public UserMdo Get()
    {
        try
        {
            SetContext();

            UserModel model = new UserModel();
            return model.GetUser(ApplicationContext.UserId);
        }
        catch(Exception)
        {
            throw;
            // return new MobileResult().SetError(1000, ex.Message);
        }
    }

    #endregion
}
  

Однако я всегда получаю несанкционированный доступ при доступе к мобильному контроллеру.
И контроллер Api также перестал работать.
Я что-нибудь пропустил? Как контроллеры узнают, что токен-носитель принадлежит Web Api или Mobile Api? Я думаю, что это проблема.

Этот код для получения токена и его использования для аутентификации

Комментарии:

1. Можете ли вы добавить некоторый код контроллера для обоих? Ваш webapiconfig.cs обрабатывает какие-либо маршруты?

2. Вы пытаетесь выпустить новые токены или проверить токены из других источников? OAuthAuthorizationServerOptions предназначен для выдачи токенов, которые будут использоваться в другом месте. Вы бы использовали OAuthBearerAuthenticationOptions для получения и проверки токенов.

3. Я обновил описание, чтобы добавить webapiconfig и контроллеры. Токен выдается и используется в том же приложении. Большое спасибо за ваш ответ