2012-04-05 36 views
6

我有一个wcf webhttp服务,它使用表单身份验证来验证用户身份。如果票证进入cookie集合或URL中,这可以正常工作。扩展表单身份验证以使用自定义http标头作为票证

但是现在我想在自定义http头中发送表单验证票证的字符串,并更改表单验证模块以检查该头文件而不是cookie。

我认为应该很容易扩展窗体auth到达此目的,但找不到任何资源如何。你能为我指出正确的方向吗 ?

这里是我的认证流程是如何工作的,

  1. 客户端调用与用户名的身份验证方法和PWD
  2. 服务返回的加密票证字符串
  3. 客户端的HTTP发送接收到的票串标题与每个后续请求
  4. 服务检查身份验证标头并验证身份验证票
+0

你试图反编译的窗体身份验证模块?你应该能够继承它并覆盖它的一些方法。或者,也许只是写你自己的完整 – cecilphillip 2012-05-04 11:03:50

+0

为什么你想发送票在自定义头,而不是标准的Cookie头? – 2012-05-07 14:35:16

+0

因为它在API场景中看起来更好。发送Cookie对于API而言看起来不自然 – Amila 2012-05-08 17:23:29

回答

3

FormAuthentication模块不可扩展,但您可以编写自己的身份验证。 这是非常简单的:

认证(2):


var formsTicket = new FormsAuthenticationTicket(
    1, login, DateTime.Now, DateTime.Now.AddYears(1), persistent, String.Empty); 
var encryptedFormsTicket = FormsAuthentication.Encrypt(formsTicket); 
//return encryptedFormsTicket string to client 

服务电话附票(4):


var ticket = FormsAuthentication.Decrypt(encryptedFormsTicket) 
//extract authentication info from ticket: ticket.Name 
+0

我实际上做了这种方法并且工作正常。 – Amila 2012-05-10 16:25:48

1

我不确定这是要走的道路(雅致),但是如何在Global.asax.cs中为Application BeginRequest添加一个事件,并从头中获取字符串并将Cookie注入到Request中(表单然后认证应该选择)。

喜欢的东西:


protected void Application_BeginRequest() 
{ 
    // Your code here to read request header into cookieText variable 
    string cookieText = ReadCookieFromHeader(); 

    var cookieData = FormsAuthentication.Decrypt(cookieText); 

    if (!cookieData.Expired) 
    { 
     HttpContext.Current.Request.Cookies.Add(new HttpCookie(cookieData.Name, cookieText)); 
    } 
} 

免责声明:请注意,我没有测试这一点,只是抛出一个可能的方法你的方式!