使用 Ajax 访问 ServiceStack 验证的服务

2023-12-03

我一直在研究一个简单的 API 示例,它是带有身份验证的 ServiceStack Hello World 示例的修改版本。概念验证的目标是创建一个 RESTful API,其中包含需要完全通过 Ajax 从多个不同 Web 项目访问的服务。

我已经阅读了 wiki,并实现了身份验证和授权以及实施 CORS(许多结果[抱歉,没有足够的信誉来指向相关链接])。此时,我的 Hello 服务可以使用自定义身份验证机制进行身份验证,该机制重写 CredentialsAuthProvider 和自定义用户会话对象。我创建了或者借用了一个简单的测试应用程序(一个完全独立的项目来模拟我们的需求),并且可以进行身份​​验证,然后调用 Hello 服务,传递名称,并通过单个接收“Hello Fred”响应浏览器会话。也就是说,我可以调用 url 中的 /auth/credentials 路径,传递用户名和 id,并收到正确的响应。然后我可以将 url 更新为 /hello/fred 并收到有效的响应。

我的理解崩溃是如何实现所有ajax调用的身份验证。我的初始登录(如下)工作正常。无论我做什么,我尝试通过 ajax 调用经过身份验证的服务,我要么收到 OPTIONS 404 错误或未找到错误,要么 Access-Control-Allow 不允许 Origin http // localhost:12345 (pseudo-link) -产地等

我需要去吗这条路线?

抱歉,如果这令人困惑。如果需要,我可以提供更多详细信息,但我认为这可能足以帮助知识渊博的人来帮助我解决缺乏理解的问题。

    function InvokeLogin() {
    var Basic = new Object();
    Basic.UserName = "MyUser";
   Basic.password = "MyPass";

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: JSON.stringify(Basic),
        url: "http://localhost:58795/auth/credentials",
        success: function (data, textStatus, jqXHR) {
                alert('Authenticated! Now you can run Hello Service.');
            },
        error: function(xhr, textStatus, errorThrown) {
            var data = $.parseJSON(xhr.responseText);
            if (data === null)
                alert(textStatus + " HttpCode:" + xhr.status);
            else
                alert("ERROR: " + data.ResponseStatus.Message + (data.ResponseStatus.StackTrace ? " \r\n Stack:" + data.ResponseStatus.StackTrace : ""));
        }
    });
}

EDIT:

根据 Stefan 提供的回复和链接,我做了一些更改:

我的配置(注意:我正在使用自定义身份验证和会话对象,并且一切正常。)

public override void Configure(Funq.Container container)
{
    Plugins.Add(new AuthFeature(() => new CustomUserSession(), 
                new IAuthProvider[] {
                new CustomCredentialsAuthProvider(),
                    }));

    base.SetConfig(new EndpointHostConfig
    {
        GlobalResponseHeaders = {
            { "Access-Control-Allow-Origin", "*" },
            { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
            { "Access-Control-Allow-Headers", "Content-Type, Authorization" },
        },
        DefaultContentType = "application/json"
    });

    Plugins.Add(new CorsFeature());
    this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
    {
        //Handles Request and closes Responses after emitting global HTTP Headers
        if (httpReq.HttpMethod == "OPTIONS")
            httpRes.EndRequest();   //   extension method
    });

    Routes
        .Add<Hello>("/Hello", "GET, OPTIONS");


    container.Register<ICacheClient>(new MemoryCacheClient());
    var userRep = new InMemoryAuthRepository();
    container.Register<IUserAuthRepository>(userRep);
}

我的简单你好服务

[EnableCors]
public class HelloService : IService
{
    [Authenticate]
    public object GET(Hello request)
    {
        Looks strange when the name is null so we replace with a generic name.
        var name = request.Name ?? "John Doe";
        return new HelloResponse { Result = "Hello, " + name };
    }
}

在进行上面的登录调用之后,我后续的 Hello 服务调用现在产生了 401 错误,这是一个进步,尽管不是我需要的地方。 ( Jquery.support.cors= true 在我的脚本文件中设置。)

function helloService() {
    $.ajax({
        type: "GET",
        contentType: "application/json",
        dataType: "json",
        url: "http://localhost:58795/hello",
        success: function (data, textStatus, jqXHR) {
            alert(data.Result);
        },
        error: function (xhr, textStatus, errorThrown) {
            var data = $.parseJSON(xhr.responseText);
            if (data === null)
                alert(textStatus + " HttpCode:" + xhr.status);
            else
                alert("ERROR: " + data.ResponseStatus.Message +
                    (data.ResponseStatus.StackTrace ? " \r\n Stack:" + data.ResponseStatus.StackTrace : ""));
        }
    });
}

同样,如果我首先正确调用 /auth/credentials,然后调用 /hello,则这在 RESTConsole 中有效。

最终编辑按照下面斯特凡的建议,包括许多其他链接,我终于能够让它工作了。除了 Stefan 的代码之外,我还必须进行一项额外的修改:

Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization"));

迎接下一个挑战:更新 Jonas Eriksson 的 CustomAuthenticateAttibute 代码(该代码似乎使用旧版本的 ServiceStack,因为一些功能不再可用。

再次感谢斯蒂芬!


这段代码对我有用,基于 Wiki 文档自定义身份验证和授权

代码也基于社区资源的博客文章ServiceStack 上的 CORS BasicAuth 具有自定义身份验证

对于基本身份验证,自定义提供程序

   public class myAuthProvider : BasicAuthProvider
    {
           public myAuthProvider() : base() { }

       public override bool TryAuthenticate(IServiceBase authService, string userName, string  password)
    {
        //Add here your custom auth logic (database calls etc)
        //Return true if credentials are valid, otherwise false
        if (userName == "admin" && password == "test")
                      return true;
         else
               return false;

    }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        //Fill the IAuthSession with data which you want to retrieve in the app 
       //  the base AuthUserSession properties e.g
       session.FirstName = "It's me";
        //...   
       //  derived CustomUserSession properties e.g
        if(session is CustomUserSession)
       ((CustomUserSession) session).MyData = "It's me";
        //...
        //Important: You need to save the session!
        authService.SaveSession(session, SessionExpiry);
    }
}

public class CustomUserSession : AuthUserSession
{

    public string MyData { get; set; }
}

在应用程序主机中

     using System.Web;
     using ServiceStack;     // v.3.9.60  httpExtensions methods, before in ServiceStack.WebHost.Endpoints.Extensions;

     using ....

应用程序主机.配置

     public override void Configure(Container container)
      {
          SetConfig(new ServiceStack.WebHost.Endpoints.EndpointHostConfig
          {
               DefaultContentType = ContentType.Json 
                 ..
               //   remove GlobalResponseHeaders  because CordFeature adds the CORS headers to  Config.GlobalResponseHeaders

            }); 
       Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization")); //Registers global CORS Headers
        this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
        {
            if (httpReq.HttpMethod == "OPTIONS")
                  httpRes.EndRequestWithNoContent();   // v 3.9.60 httpExtensions method before httpRes.EndServiceStackRequest();  

        });

          //Register all Authentication methods you want to enable for this web app.
            Plugins.Add(new AuthFeature(() => new  CustomUserSession(), // OR the AuthUserSession 
                new IAuthProvider[] {
                new  myAuthProvider(),   
              }) { HtmlRedirect = null }); //  Redirect on fail 

Html 重定向答案

             Routes.Add<TestRequest>("/TestAPI/{Id}", "POST,GET, OPTIONS");
        ....
      } 

服务中

           [Authenticate]
          public class TestAPI : Service
            {    
                 ...
            }

在 JavaScript 中

     jQuery.support.cors = true;

       function make_base_auth(user, password) {
          var tok = user + ':' + password;
          var hash = btoa(tok);
          return "Basic " + hash;
      }

先登录

           function Authenticate() {

              $.ajax({
              type: 'Post',
              contentType: 'application/json',
              url: serverIP + 'Auth',
              cache: false,
              async: false,
              data: {},
              dataType: "json",
              beforeSend: function (xhr) {
                  xhr.setRequestHeader("Authorization", make_base_auth(username, password));
              },
              success: function (response, status, xhr) {
                  localStorage.sessionId = data.SessionId;
                  var UserName  = response.userName;
              },
              error: function (xhr, err) {
                  alert(err);
              }
          });
      }  

并请求

         function DoTest() {
              var TestRequest = new Object();
              TestRequest.name = "Harry Potter";             
              TestRequest.Id = 33;
             var username = "admin";
             var password = "test"; 

             $.ajax({
              type: 'Post',
              contentType: 'application/json',
              cache: false,
              async: false,
              url: serverIP + '/TestAPI/'+ TestRequest.Id,
              data: JSON.stringify(TestRequest),
              dataType: "json",                  
              beforeSend: function (xhr) {                    
                xhr.setRequestHeader("Session-Id", localStorage.sessionId);
              },
           success: function (response, status, xhr) {
                  var s= response.message;      
              },
              error: function (xhr, err) {
                  alert(xhr.statusText);
              }
          });
      }

这些问题here and here有帮助。

还有这个answer对于 CredentialsAuthProvider,如果我们可以使用 cookie 和sessions.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ajax 访问 ServiceStack 验证的服务 的相关文章

  • Chromium 上的 HEAD XMLHttpRequest

    我尝试使用 Chromium 中的 XMLHttpRequest 获取 HEAD 响应以检索压缩 url 的位置 URL 但失败 var ajax new XMLHttpRequest ajax onreadystatechange fun
  • 将自定义参数传递给登录页面 Identity Server 4 中使用的 returnUrl

    我正在使用 IdentityServer4 为使用混合流的客户端实现身份验证服务器 我成功地实现了自己的用户存储以及自己的客户 赠款和资源存储库 当用户想要登录时 客户端会将其重定向到我的身份验证服务器 如果未登录 则会显示登录页面 此时
  • 如何防止客户修改 firebase 数据(在没有后端的 Web 应用程序中)?

    我最近开始探索 firebase 作为我的 Angular JS 单页网站的身份验证解决方案 它看起来很完美 然而 从安全角度来看 我不太确定是否将逻辑保留在我的应用程序中的客户端 假设我对在我的网站上注册的客户进行了 isProfileC
  • 将对象传递给jquery中的回调函数

    我最近正在开发小型聊天模块 该模块需要不断检查服务器是否有新消息 我正在向服务器发送 ajax 请求 服务器将保持连接 直到找到新消息 长轮询 Code var chatController function other variable
  • IOS - 委托与通知

    想听听您对以下架构的看法 在我的应用程序中 我有一个处理异步登录的静态类 LoginManager 登录阶段完成后 应用程序应该做出响应并转换到另一个状态 我有2条实施建议 使用委托 import Foundation protocol L
  • 数据未正确加载到 Firebase 应用程序中

    我在 android studio 上使用 firebase 创建了一个应用程序 使用移动 otp 进行身份验证后会出现一个搜索视图 当用户在搜索视图上搜索时 它将过滤结果并转到回收器视图等 第一次启动活动 即身份验证后的家庭活动 应用程序
  • ServiceStack 身份验证中 httponly ss-tok bearerToken cookie 的意义是什么

    我从安全角度理解 Set Cookie 响应标头值的 httponly 标志的概念并防止 XSS 攻击 我不明白的是 ServiceStack 对保存 bearerToken 的 ss tok cookie 做了什么 根据服务堆栈文档 ht
  • 如何使用 HttpClient 验证 Pardot API

    我花了大约一天的时间尝试对 Pardot API 进行身份验证 它不喜欢我尝试发布消息正文的方式 所以我想发布对我有用的解决方案 如果您有任何建议或替代方案 我想听听 ServicePointManager SecurityProtocol
  • 在 JSP 中从 JavaScript/jQuery 调用后端 Java 方法

    我有一个 JSP 其中有一个select包含实体种类名称的列表 当我选择一个实体类型时 我需要填充另一个实体类型select包含所选实体类型的字段名称的列表 为此 我调用了一个 JavaScript 函数onchange event 在 J
  • 通过 JDBC 与 CLI 使用 MIT Kerberos 连接到 PostgreSQL 9.4 时出错

    我已经使用 MIT Kerberos 5 设置了 PostgreSQL 9 4 并且可以使用 psql 在 CLI 上连接 提交指纹后 我的委托人是 bgiles postgres REALM pg hba conf 有 host all
  • 在 ServiceStack 中使用 ASP.NET 成员资格

    我该如何使用ASP NET 会员资格 in 服务栈 http www servicestack net ServiceStack OrmLite ServiceStack Host AspNet 等 您可以将 ServiceStack 托管
  • 使用 Express 检测 NodeJS 上的 AJAX 请求

    我正在使用 NodeJS 和 Express 如何区分普通浏览器请求和 AJAX 请求 我知道我可以检查请求标头 但是 Node Exprsss 是否会公开此信息 大多数框架设置了X Requested With标头至XMLHttpRequ
  • Internet Explorer 不渲染从 JQuery ajax 帖子返回的 html

    我有一个带有输入框的页面 其 onkeyup 根据输入的内容 搜索字段 触发 JQuery ajax 帖子 ajax 调用回发的 html 应该填充页面上的另一个 div 这是 jquery ajax 帖子 var o me results
  • 使用 JSONP 时出现“无效标签”?

    我的 JSONP 请求有问题 数据不会显示 Firebug 显示 无效标签 错误 我的 JavaScript ajax url link dataType jsonp beforeSend function xhr var base64 b
  • 身份验证在不应该返回“401(未经授权)”时返回

    我第一次设置身份验证功能 在用户登录后得到了一些意外的结果 一位同事给了我一个具有工作身份验证的应用程序 以模仿我的应用程序 看起来我所做的一切都是正确的 我在前端使用 AngularJS 在后端框架使用 SailsJS 并且护照JS ht
  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • 如何使用我自己的自定义身份验证服务使用团队机器人对用户进行身份验证?

    我在 azure 上创建了一个机器人 并在机器人注册通道中注册了它 现在 我想使用我自己托管的自定义身份验证服务 例如 https domainname auth 来使用机器人对用户进行身份验证 我不知道该怎么做 我已阅读 bot 框架文档
  • Internet Explorer 中的 AJAX 问题

    这在 FF safari chrome 和 opera 中工作得很好 但在 IE 中却不行 错误代码是403 var datau trends php 3Frastgele 3D33 ajax type GET url loader php
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • UpdatePanel 破坏 JQuery 脚本

    这是我想做的事情的简化版本 基本上我有一个数据列表 里面有很多东西 当你将鼠标悬停在数据列表中的项目上时 我希望 jquery 隐藏 显示东西 问题是 在我进行数据绑定后 如果 gridview repeater datalist 位于更新

随机推荐

  • 如何使用 ImageLocation 将图像放入图片框中?

    我在面板中创建了一个图片框 我想在本地用图像填充它 这就是我到目前为止所做的 以下代码只是我的面板创建代码的一小部分 PictureBox picture new PictureBox Name pictureBox Size new Si
  • 使用dompdf将html文件转换为pdf

    如何正确使用 dompdf 将 html 文件转换为 pdf 我正在做这样的事情 但我收到这个错误 Fatal error Call to undefined method Inline Frame Decorator normalise
  • 使用 linkedin v2 api 共享图像时未在页面提要上发布

    好吧 这是我的问题 要通过 linkedin api 共享图像帖子 您首先必须注册您的图像文件 您可以通过发送二进制文件的帖子请求来完成此操作 然后 您使用原始请求中的图像 URN 来提交您的帖子 我的请求通过 返回 201 代码 这应该是
  • “主线程可以动态增长其堆栈”是什么意思

    在 pthread attr setstacksize 的手册页上https man7 org linux man pages man3 pthread attr setstacksize 3 html A thread s stack s
  • 如何检测Recyclerview项目是否被刷卡?

    我正在尝试添加滑动删除的功能 以及在长按 RecyclerView 项目时显示底部工作表弹出窗口的功能 我在用ItemTouchHelper SimpleCallback用于滑动删除和ItemTouchListener用于在长按项目时显示弹
  • 如何更改AndEngine中的TimerHandler延迟?

    我创建了这个方法 每秒都会向我的 andengine 场景添加一个精灵 private void createSpriteSpawnTimeHandler TimerHandler spriteTimerHandler float mEff
  • R中有没有办法连接csv文件的断线?

    我有一个程序可以导出 csv 文件 但不引用新行或使用 n代替 n r 它在记录中间使用与末尾相同的行尾 然而 该程序在变量之间使用逗号分隔符 我怎么知道R删除所有 eol 标记 直到达到数据中的变量数量 我的数据如下所示 name ran
  • 为什么此代码返回分段错误错误?

    我已经实现了以下代码来对矩阵执行 filter2D 编译程序后 它返回分段错误错误 在这个程序中 我想在程序中分配一个输入数组 不想加载图像 然后执行程序内部分配的过滤器 以测量运行时不同矩阵和内核的filter2D函数的时间 includ
  • 如何使用Jquery Mobile Slide Panel从底部向上滑动?

    我正在开发一个应用程序 当选择某些内容时 我需要一个面板从底部向上滑动 我在 jquery mobile 滑动面板中看到您可以将位置设置为左侧或右侧 但是如何设置为底部 see https github com jquery jquery
  • java中如何对ResultSet进行排序?

    顺便说一句 我不能在数据库中执行 ORDER BY 将结果提取到List
  • 如何在 Laravel 5 中获取复选框数组的值?

    我使用 javascript 在表单中创建了复选框
  • F# :可以引用自身的递归值

    我有一个记录 type node content string parent node option branch string option children seq
  • xPath vs DOM API,哪个性能更好

    好吧 假设我正在开发一个项目 该项目将有很多人同时在线 并且我需要向他们提供来自一些 XML 文件的数据 当涉及到性能问题时 最好的方法是什么 之间有什么真正的区别吗xPath or DOM或者我不应该关心 直接使用我最喜欢的那个 另外 使
  • 如何禁用 Jquery 自动完成组合框中的特定选项

    当我有简单的下拉框时
  • 如何使用 MenuItem 进行导航?材料-ui V1

    为什么尚不清楚如何MenuItem导航到其他路线 例如 当单击菜单项时 我想路由到 account 我可以使用 onclick 函数来实现这一点 但我确信有一种更简单的方法 请告诉我 我想在我的项目中实现它 顺便说一下 当使用contain
  • SGE批处理文件未读取.bashrc并且未找到conda命令[重复]

    这个问题在这里已经有答案了 我有多个conda环保工作良好 当我尝试使用提交作业时qsub对于上海金交所来说 bashrc文件未读取 批处理脚本如下所示 bin bash S bin bash cwd l h cpu 48 00 00 l
  • 使用 Python“请求”登录并上传文件

    我需要登录并上传文件 我面临的问题是 登录页面与上传页面不同 如果我必须手动执行此操作 我将登录 login php 到该网站 然后导航到上传页面 uploader php 上传文件 这是我写的 import requests url1 h
  • 如何在 Node.js 中设置文件编码

    我在 Node js 中设置编码时遇到一些问题 我尝试使用 writeFile 函数将编码设置为 utf8 但没有结果 我想使用node js设置编码的当前文件是用unicode编码的 默认情况下 fs 模块将以 utf8 编码写入文件 U
  • Magento:取消发货订单后增加“数量”

    我使用的是 Magento 1 7 0 2 我使用 货到付款 作为我的付款方式 我会准确地告诉您我在任何订单上遵循的步骤 下订单时 数量减少 1 件 我会为其创建发货 如果客户支付了订单总价 我为该订单创建了一张发票 我的问题是 如果下订单
  • 使用 Ajax 访问 ServiceStack 验证的服务

    我一直在研究一个简单的 API 示例 它是带有身份验证的 ServiceStack Hello World 示例的修改版本 概念验证的目标是创建一个 RESTful API 其中包含需要完全通过 Ajax 从多个不同 Web 项目访问的服务