簡體   English   中英

此請求已被拒絕授權。 總是

[英]Authorization has been denied for this request. Always

我已經創建了一個MVC webApi項目,現在我想使用身份驗證和授權。 我認為我已經實現了這種安全性,但由於某些原因,一些事情變得糟糕,當我編寫我的憑據並嘗試調用一些webApi方法時,會顯示消息“此請求已被拒絕授權”。

這是我實現的代碼。

WebApiConfig:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Filters.Add(new AuthorizeAttribute());
    }

路由配置:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Routing", action = "LogIn", id = UrlParameter.Optional }
        );
    }

控制器:

public class RoutingController : Controller
{
    //
    // GET: /Routing/
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Projects()
    {
        return View();
    }

    public ActionResult Users()
    {
        return View();
    }

    public ActionResult LogIn()
    {
        return View();
    }

    [HttpPost]
    public JsonResult LogInPost(string userName, string password)
    {
        User user = new User();
        RoleByUser rByU = new RoleByUser();
        password = UserController.EncriptPassword(password);
        string url = string.Empty;
        var checkUser = user.Get(userName);
        var userExists = (from userInList in checkUser where userInList.UserName == userName && userInList.Password == password select userInList).FirstOrDefault();
        if(userExists!= null)
        {
            var roles = (from roleByUser in userExists.listOfRole select roleByUser.RoleName.Trim()).ToArray();
            IPrincipal principal = new GenericPrincipal(
            new GenericIdentity(userExists.UserName), roles);
            SetPrincipal(principal);
            url = "Routing/Users";
        }
        return Json(url);
    }

    private void SetPrincipal(IPrincipal principal)
    {
        Thread.CurrentPrincipal = principal;
        if (System.Web.HttpContext.Current != null)
        {
            System.Web.HttpContext.Current.User = principal;
        }
    }

}

HTML:

<link href="~/css/Style.css" rel="stylesheet" type="text/css" />

<div class="container">
    <div class="card card-container">
        <img id="STK" class="profile-img-card" src="Images/Softtek.png" />
        <p id="profile-name" class="profile-name-card"></p>
        <form class="form-signin">
            <span id="reauth-email" class="reauth-email"></span>
            <input type="text" id="txtUserName" class="form-control" placeholder="Email address" required autofocus />
            <input type="password" id="txtPassword" class="form-control" placeholder="Password" required />
            <div id="remember" class="checkbox">
                <label>
                    <input type="checkbox" value="remember-me" /> Remember me
                </label>
            </div>
            @*<button id="btnLogIn" class="btn btn-lg btn-primary btn-block btn-signin"  >Sing In</button>*@
        </form><!-- /form -->
        <button id="btnLogIn" class="btn btn-lg btn-primary">Sing In</button>
        <a href="#" class="forgot-password">
            Forgot the password?
        </a>
    </div><!-- /card-container -->
</div><!-- /container -->

JS:

$(document).ready(function(){$('#btnLogIn')。click(logIn);});

function logIn() {
    $.ajax({
        type: "POST",
        url: "http://localhost:21294/Routing/LogInPost",
        dataType: "json",
        data: { userName: $('#txtUserName').val(), password: $('#txtPassword').val() },
        success: function (data) {
            if(data!= "" && data!= undefined && data!= null)
                window.location.href = data;
        },
        error: function (err, e, error) {
            toastr.error('Error')
        }
    });

您應該將[AllowAnonymous]屬性添加到Controller的LogInPost

AuthorizeAttribute添加到過濾器時,會導致控制器假定所有操作(包括用於登錄的操作)默認需要授權。

你在做Windows身份驗證嗎? 你收到“拒絕訪問”錯誤?

有時IISEXpress和IIS做了一些技巧並且克服了我在本地iis(inetmgr)中托管該站點的情況,啟用身份驗證(如果適用,則啟用Windows)並立即運行它。

PS並非所有機器都默認安裝了IIS服務器,因此如果inetmgr不起作用,則必須從控制面板 - > Windows功能 - >選擇IIS和ASP .NET的所有功能

希望這會有所幫助。

很抱歉這么晚的回復 - 我找到了你的問題,因為,從IIS托管的網絡API切換到自托管的網絡API,我剛開始遇到同樣的問題。

在我的情況下,問題是由我如何初始化Thread.CurrentPrincipal引起的。 一些背景:

  1. 我正在使用自定義AuthenticationHandler(繼承自DelegationHandler)
  2. 在這個處理程序中,我重寫了SendAsync方法來進行一些自定義用戶驗證。
  3. 如果驗證成功,我構造一個ClaimsPrincipal類的實例,以包含有關當前用戶的一些聲明。

以前,我將此ClaimsPrincipal實例分配給Thread.CurrentPrincipal,然后將消息傳遞給管道中的其余消息處理程序。 但是,我的解決方案是在HttpRequestContext實例上使用Principal成員,該實例屬於傳遞給SendAsync的HttpRequestMessage實例。 因此(在F#中),

override this.SendAsync(request : HttpRequestMessage, cancellationToken : CancellationToken) =
  // Do some user validation here first
  // .. then setup the claims (method details omitted) 
  let principal = BuildClaimsPrincipal

  // Assign to Principal on HttpRequestContext
  let requestContext = request.GetRequestContext
  requestContext.Principal <- principal

  // Rest of method omitted...

希望這能夠以某種方式幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM