11

ASP.NET でのフォーム認証の利点が必要です。私はそれが私のために承認を持続させたいと思っていますが、私の状況には1つの違いがあります。シンプルな Web サービス (具体的にはクライアントによって提供される) に対して認証したい。

Web の場所を見て、承認する必要があるかどうかを確認するコードを用意しましたが、ASP.NET で現在のユーザーが承認されていることを示す Cookie[?] または承認フラグを設定するにはどうすればよいですか。

基本的...

if (HttpContext.Current.User.Identity.IsAuthenticated)
// we're all good

//Other wise...
bool success = CheckClientsWebService(string username, string password);

if (success)
// Somehow tell .NET that they're authorized

*注意: これは、グループやロールを扱わない、かなり単純なサービスです。ユーザーがサイトを閲覧できるかどうかを確認するだけです。

4

3 に答える 3

10

フォーム認証では、フォーム認証 Cookie であなたが誰であるかを証明することはできません。それを念頭に置いて、カスタム プロバイダーを作成せずに、カスタム ログイン フォームでチケットを作成できませんでしたか? 私は間違いなくあなたができると思います。簡単なテストを行ってフォーム認証チケットを作成し、すぐに使用できるメンバーシップ プロバイダーがユーザーを認証済みと見なすかどうかを確認します。

私は興味があったので、ここにいくつかのコードがあります..

モデル

public class SignInViewModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

コントローラ

public class SignInController : Controller
{

    public ActionResult Index()
    {
        var model = new SignInViewModel {};
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SignInViewModel model)
    {
        if (model.Username == "Fred" && model.Password == "Mertz")
        {
            FormsAuthentication.SetAuthCookie(model.Username, false);
            return RedirectToAction("Secure");
        }
        return View(model);
    }

    [Authorize]
    public ActionResult Secure(SignInViewModel model)
    {
        return View();
    }

    [Authorize]
    public ActionResult Logout(SignInViewModel model)
    {
        FormsAuthentication.SignOut();
        return RedirectToAction("Index");
    }

インデックス.cshtml

@using (Html.BeginForm()) {
    <fieldset>
        <legend>SignInViewModel</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Username)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Username)
            @Html.ValidationMessageFor(model => model.Username)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>

        <p>
            <input type="submit" value="Login" />
        </p>
    </fieldset>
}

Secure.cshtml

<h2>Secure</h2>
@Html.ActionLink("Logout", "Logout")
于 2012-08-31T00:42:24.277 に答える
7

私はこれを単純化しすぎているかもしれませんが、これを読む方法は次のとおりです。

  1. ユーザーが認証されていない場合は、ユーザー名/パスワードを収集するフォームがあります
  2. そのフォームの結果は、承認のために Web サービスに渡されます。
  3. その承認が成功した場合、サインインしたことを Web アプリケーションに知らせる方法が必要です。
  4. それらが認証されている場合は、何かを行います

上記が正しければ、メンバーシップ プロバイダーは必要ありません。[Authorize] 属性は、フォーム認証 Cookie が設定されているかどうか、および Cookie の現在の有効期間が有効であるかどうかを確認するだけです。この認証 Cookie は、ユーザーのユーザー名と Cookie の有効期限 (およびその他のものですが、ここでは重要ではありません) を保存します。

そのため、web.config 構成要素を設定し、認証 Cookie を設定する方法を用意するだけで済みます。

Web.Config

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>
</system.web>

ログオン URL GET アクション

public ActionResult Logon(){
   //if the user is logged in, send the to the home page
   if(httpContext.User.Identity.IsAuthenticated_{
        Return RedirectToAction("Index", "Home");
   }
   Return this.View(new LoginViewModel());
}

ログオン URL POST アクション

[HttpPost]
public ActionResult Logon(LoginViewModel model){
   //Check for model errors
   if(!ModelState.IsValid()){
       Return this.View(model);
   }

   //Validate against web service - return error if false
   if(!CheckClientsWebService(model.UserName, model.Password)){
       ModelState.AddModelError("","The username or password is invalid");
       Return this.View(model);
   } 

   //Manually set the authentication cookie
   FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);  
   //Send them on to the home page, they now have a authorization cookie
   Return RedirectToAction("Index", "Home");
}

関数を.SetAuthCookie()呼び出すと、ユーザーは認証チケットをHttpContext.User.Identity.IsAuthenticated取得し、Cookie の有効期限が切れておらず、ユーザー名を取得できる限り、への呼び出しは true になります。HttpContext.User.Identity.Name

于 2012-08-31T04:39:35.857 に答える
0

Wiktor がコメントしたように、独自のMembershipProviderを実装します。必要なメソッドを実装するだけで、残りはNotImplementedException.

あなたの場合、実装する必要がpublic bool ValidateUser(string username, string password)あるのは、Webサービスを呼び出すだけでよい実装だけのようです。

その後、すべての標準の組み込み認証および承認機能を使用できます。

于 2012-08-30T21:16:05.900 に答える