5

我想使用ASP.NET SimpleMembership來認證使用我的WebAPI的用戶。 Thinktecture具有一個名爲Thinktecture.IdentityModel(http://thinktecture.github.com/Thinktecture.IdentityModel.45/)的美妙的身份驗證庫,其中包含一個將Forms Auth與基本身份驗證(source)關聯的示例。但是,該示例使用Membership.ValidateUser(),如果沒有ASP.NET成員資格提供程序不起作用,SimpleMembership不支持(source)(編輯:這不完全正確,請參閱下面的Mark的回答) 。Thinktecture.IdentityModel with SimpleMembership


編輯

這裏就是我所做的:

1)通過的NuGet

3創建一個新的MVC互聯網應用

2)安裝Thinktecture.IdentityModel)通過腳手架創建模型和api控制器:

public class Goober 
{ 
    public int GooberId { get; set; } 
    public string GooberWords { get; set; } 
} 

4)冉項目,創建新用戶以及創建使用招

新落花生

5)添加了[授權]至GetGoober(INT ID)

6)在加入WebApiConfig.cs:

var authConfig = new AuthenticationConfiguration(); 

authConfig.AddBasicAuthentication((userName, password) => 
    Membership.ValidateUser(userName, password)); 

config.MessageHandlers.Add(new AuthenticationHandler(authConfig)); 

當我運行該項目,並打API /落花生/ 1提琴手我得到401 WWW身份驗證:未指定。但是如果我先使用AccountController登錄然後使用Fiddler,我會得到一個並且一切都很好。

編輯

好吧,我覺得這個問題是不是與我最初的問題。我懷疑它與模板中SimpleMembership的初始化有關。當我打開該項目並運行調試,然後用提琴手點擊api我無法通過驗證。但是當我只需點擊網頁前端的「註冊」鏈接時,就可以通過Auth。我猜這是因爲InitializeSimpleMembershipAttribute在AccountController被調用,所以直到控制器被調用才初始化?


我已經嘗試在Membership.ValidateUser()的地方使用WebSecurity.Login(),但不起作用。

我對如何實際執行此操作感到茫然。有人有建議嗎?或者,我試圖從錯誤的角度來解決這個問題?

回答

3

您確定ASP.NET會員提供商與SimpleMembershipProvider不兼容,但SimpleMembershipProvider確實支持ValidateUser,請參閱here。假設SimpleMembership已正確配置並初始化,您應該仍然可以撥打Membership.ValidateUser()

如果您已經嘗試Membership.ValidateUser()並且出現錯誤,請告訴我們,我們可以嘗試解決它。

更新

所以有跟着你再現步驟我設法針點錯誤。將內建的Thinktecture AuthenticationHandler處理程序嵌入並在調試中運行。在向api控制器發出請求之後30秒,正在引發數據庫連接錯誤。這是異步和無聲的失敗。

經過一番討論後,我認爲它是DefaultConnection錯誤的連接字符串。

像我默認連接可能包含一個文件名是這樣的: AttachDBFilename = | DataDirectory目錄| \ ASPNET,MvcApplication3-20121215104323.mdf」

當的ValidateUser時調用的應用程序註冊的委託內啓動(爲驗證憑據),這似乎是未能解決|DataDirectory|我發現,通過更新的全名這條道路我的連接問題就走了。

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcApplication3-20121215104323;Integrated Security=SSPI;AttachDBFilename=C:\mydatabase\file\path\example\aspnet-MvcApplication-20121215104323.mdf" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

然後我發現這個職位here,則表明AppDomain中有沒有有它數據目錄正確設置在這一點上。

所以一旦配置設置和使用適當的文件路徑和用戶名「測試」和密碼「測試」修改連接字符串通過提琴手這一請求得到了一個200:

GET http://localhost/api/goober/1 
User-Agent: Fiddler 
Host: localhost 
Authorization: Basic dGVzdDp0ZXN0aW5n 

順便說一下

我發現要獲得表單授權令牌也允許訪問api控制器我必須添加此。否則Thinkteckture代碼設置的原則回匿名:

添加此

authConfig.InheritHostClientIdentity = true; 

爲了抵消this(52行):

if (_authN.Configuration.InheritHostClientIdentity == false) 
{ 
    //Tracing.Information(Area.HttpAuthentication, "Setting anonymous principal"); 
    SetPrincipal(Principal.Anonymous); 
} 
+0

嗨,馬克 - 感謝您的答覆!我沒有嘗試Membership.ValidateUser(),但無法讓它工作。當我回到辦公室時,我會在明天更新我的問題。我感謝您的幫助! – brudert

+0

@brudert偉大的東西,讓我知道錯誤是什麼爲ValidateUser(),我們可以得到修復。 –

+0

謝謝,我用更多的細節更新了我的問題 – brudert