これが私のシナリオです。
別のドメインによって公開されている認証 Web サービスがあります。ここで、認証のためにユーザー名とパスワードをその外部ドメインに送信したいと考えています。そして、ユーザーが認証されると(返されるtrue
)、ASP.netがその認証をさらに進めて、ユーザーを許可し、現在のユーザー、Isauthorized、ロールなど、ユーザーが認証されたすべてのasp.net標準ユーティリティにアクセスできるようにします. これが理にかなっていることを願っています。
これが私のシナリオです。
別のドメインによって公開されている認証 Web サービスがあります。ここで、認証のためにユーザー名とパスワードをその外部ドメインに送信したいと考えています。そして、ユーザーが認証されると(返されるtrue
)、ASP.netがその認証をさらに進めて、ユーザーを許可し、現在のユーザー、Isauthorized、ロールなど、ユーザーが認証されたすべてのasp.net標準ユーティリティにアクセスできるようにします. これが理にかなっていることを願っています。
これは問題ではありません。さまざまなオプションをご用意しています。1 つのアプローチは、フォーム認証を独自のセキュリティ モデルと組み合わせることです。
基本的な考え方は、Forms Auth がログイン ユーザーのチケットを (暗号化されたチケットの形式で) 作成および管理できるようにすることです。チケットは、誰かがログインしているかどうか、およびその人が誰であるかを判断するために使用されます。次に、その上に追加のセキュリティ関連のロジックを混在させることができます。
ログイン要求を処理するには、通常のようにコントローラーとアクションを用意するだけです。注: 以下の例では、 、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);
}
}
HTTP モジュールを web.config に登録します。
<httpModules>
<add name="CustomAuthHttpModule"
type="MyAssembly.CustomAuthenticationModule, MyAssembly" />
</httpModules>
MVC コントローラーやビュー、AuthenticatedAttribute
などで User オブジェクトを使用できるようになりました。
ただし、ユーザーのロールを検索した結果をキャッシュして、Web サービスを壊さないようにすることをお勧めします。それはあなたに任せます。
アプリケーションに Security Token Service を使用できます。Windows Identity Foundation SDK をセットアップし、sdk ディレクトリで例を見つけます (私にとっては、「C:\Program Files (x86)\Windows Identity Foundation SDK\v4.0\Samples\End-to-end\Federation for Web Apps」です)。 . それらの 1 つ (「Federation for Web Apps」という名前) は、AD 認証のケースを実装します。