ASP.NET MVC - 手动授权人,并通过窗体身份验证坚持授权(MVC ASP.NET - M

2019-07-31 07:19发布

我想在ASP.NET窗体身份验证的好处。 我希望它坚持我和这样的授权,但有一件事我的情况不同; 我想对一个简单的Web服务(客户特别提供)进行身份验证。

我有我的代码后看网络的地方,看他们是否应该被授权,但要我怎么设置cookie [?]或授权标志在ASP.NET他们知道当前的用户被授权。

基本上...

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

*注:这是一个相当简单的服务,不与组或角色处理。 如果用户是好的,查看现场?只需勾选。

Answer 1:

在窗体身份验证不是你是个窗体身份验证cookie谁证明? 考虑到这一点不能创建一个自定义登录表单的票,而无需创建定制的提供者? 我肯定会认为你可以。 做一个快速测试,并创建一个窗体身份验证票,看看开箱成员提供的认为认证的用户。

我curious--所以这里是一些代码..

模型

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");
    }

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")


Answer 2:

我可能是在简化,但我读这篇文章的方法如下:

  1. 如果用户没有通过验证,你有你收集的用户名/密码形式
  2. 这种形式的结果传递给授权Web服务
  3. 如果授权是成功的,你需要一种方法来让Web应用程序知道,他们已经签署。
  4. 如果它们已通过认证,做的东西

如果以上是正确的,你不需要一个成员提供。 在[授权]属性只是看起来是窗体身份验证Cookie,看它是否已定,是有效的cookie的当前生存。 这验证cookie存储用户的用户名和cookie的到期时间(和其他的东西,但在这里并不重要)。

鉴于这种情况,你只需要设置你的web.config配置元素,必须设置身份验证cookie的方法。

Web.Config中

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

登录网址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());
}

登录网址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的未到期将是只要真实,你可以从用户名HttpContext.User.Identity.Name



Answer 3:

作为Wiktor的评论,实现自己的MembershipProvider 。 只实现你需要的方法,保留其余抛NotImplementedException

在你的情况下,它看起来像你需要实现的public bool ValidateUser(string username, string password) -这仅仅需要通过打电话给你的web服务的实施。

然后你可以使用内置的身份验证和授权的东西全部标准。



文章来源: MVC ASP.NET - Manually authorize someone and persist the authorization via Forms Authentication