c# - Asp.net 表单例份验证 Web 服务

标签 c# .net

我有一个小难题,我有一个使用基于表单的身份验证的 asp.net 应用程序。在应用程序内部,我有一个检查 User.IsInRole("somerole") 的 Web 服务,自从用户登录后,它就可以很好地处理来自应用程序的 ajax 调用,并且 ajax 调用来自他登录的浏览器。

现在,我想让一个胖客户端调用 web 服务(初学者的 c# 控制台客户端),但无法弄清楚如何将凭据信息传递给它。

我已经考虑过执行以下操作但无济于事:

SomeWebService svc = new SomeWebService();
svc.Credentials = new NetworkCredential("formsusername","formspassword","");
String returnValue = svc.CallMyWebMethod();

有人能告诉我这个技巧吗? :-)

谢谢!

最佳答案

Forms Authentication 的工作原理是让客户端在每个请求中发送一个 Cookie。当客户端通过发送正确的凭据成功进行身份验证时,服务器会发出此 cookie。

因此,为了使用表单例份验证对用户进行身份验证,您需要在控制台应用程序中执行以下步骤:

  1. 向某个网页发送 HTTP POST 请求并传递用户名和密码。作为响应,网络服务器将为您提供您需要捕获的身份验证 cookie(Set-Cookie HTTP 响应 header )。这通常是您的日志页面。
  2. 调用您的网络服务时,您需要传递此 cookie(Cookie HTTP 请求 header )。为了随请求一起设置 cookie,您必须覆盖为您生成的客户端代理类上的 GetWebRequest 方法:

    protected override WebRequest GetWebRequest(Uri uri)
    {
        var request = (HttpWebRequest)base.GetWebRequest(uri);
    
        request.CookieContainer.Add(
            new Cookie(
                ".ASPXAUTH", 
                "THE VALUE YOU HAVE RETRIEVED WHEN YOU SEND YOUR FIRST LOGON REQUEST"
            )
        );
    
        return request;
    }
    

关于c# - Asp.net 表单例份验证 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11114353/

相关文章:

C#:如何从另一个线程访问主 UI 线程中的整数?

c# - F# 程序集引用导致构建问题?

c# - 处理这些 PDFSharp 表格限制的最佳方法是什么?

c# - 在 .NET/C# 中克隆或使 MailMessage 不可变

.net - 使用 GZipStream 附加到压缩文件

c# - 为什么通过 google api 进行的 google 搜索会返回与网页中的搜索不同的结果?

c# - 像 C# 的计算引擎这样的东西?

.NET 正则表达式匹配不正确

base64 - .NET 有 Base64Stream 吗?

.net - 资源/App.config 或数据库哪里是应用程序字符串的最佳位置