這是我的方案。使用asp.net身份驗證與自定義身份驗證
我有另一個域暴露身份驗證的Web服務。現在我想要將用戶名和密碼發送到該外部域進行身份驗證。而當用戶進行身份驗證(返回true
),我想ASP.net,以採取進一步的認證,並讓用戶和提供我所有的asp.net標準工具訪問,像currentuser,Isauthorized,角色等,對於用戶來說,認證。我希望這是有道理的。
這是我的方案。使用asp.net身份驗證與自定義身份驗證
我有另一個域暴露身份驗證的Web服務。現在我想要將用戶名和密碼發送到該外部域進行身份驗證。而當用戶進行身份驗證(返回true
),我想ASP.net,以採取進一步的認證,並讓用戶和提供我所有的asp.net標準工具訪問,像currentuser,Isauthorized,角色等,對於用戶來說,認證。我希望這是有道理的。
這不是問題。你有各種選擇可供你使用。一種方法是將Forms Authentication與您自己的安全模型混合。
的基本思想是讓窗體身份驗證的登錄用戶創建和管理一票(在加密票證的形式)。該票據用於確定某人是否已登錄,以及他們是誰。然後,您可以混合使用任何其他安全相關的邏輯。
要處理的登錄請求,你只需要一個控制器和行動就像你通常會。注意:在下面的例子中,我對LoginViewModel
做了一些假設,你用來驗證的服務和它返回的對象(如果有的話)。你將不得不依靠你的實際邏輯。
public ActionResult Login(LoginViewModel model)
{
// make sure the user filled out the login fields correctly
if (!ModelState.IsValid) return View(model);
// authenticate the user here
var authenticatedUser = AuthorizeUserUsingRemoteWebService(model.Username, model.Password);
if (authenticatedUser.IsAuthenticated)
{
// create forms auth ticket cookie and redirect to the home page
FormsAuthentication.SetAuthCookie(authenticatedUser.Username);
return RedirectToAction("Index", "Home");
}
// authentication failed, so show the login page again
return View(model);
}
除此之外,你可能有一個處理AuthenticateRequest事件的HTTP模塊。您的模塊將在Forms Auth HTTP模塊之後註冊,因此無論用戶是否登錄,它都已處理完畢。您想要執行的操作是在登錄時查找其他信息,以獲取角色等。
public class CustomAuthHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(OnAuthenticateRequest);
}
void OnAuthenticateRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = appObject.Context;
// user isn't logged in, so don't do anything else
if (!context.User.Identity.IsAuthenticated) return;
// look up the roles for the specified user, returning the role names as an array of strings
string[] roles = LookupUserRolesFromWebService(context.User.Identity.Name);
// replace the current User principal with a new one that includes the roles we discovered for that user.
context.User = new GenericPrincipal(new GenericIdentity(context.User.Identity.Name), roles);
}
}
你會在你的web.config註冊HTTP模塊:
<httpModules>
<add name="CustomAuthHttpModule"
type="MyAssembly.CustomAuthenticationModule, MyAssembly" />
</httpModules>
現在,您可以使用用戶對象在你的MVC控制器和視圖,該AuthenticatedAttribute
等
但是,我建議您緩存查找用戶角色的結果,這樣您就不會錘擊您的Web服務。我會留給你的。
您可以使用安全令牌服務爲您的應用程序。設置Windows Identity Foundation SDK並在sdk目錄中找到示例(對於我來說,它是「C:\ Program Files(x86)\ Windows Identity Foundation SDK \ v4.0 \ Samples \ End-to-end \ Web應用程序的聯合」) 。其中一個(名爲「Web應用程序聯盟」)實施您的AD認證案例。