簡體   English   中英

將Active Directory與Web API用於SPA

[英]Use Active Directory with Web API for SPA

我正在構建單頁面應用程序,我想知道用戶的身份。 我們的內聯網中有Active Directory,但我對此並不了解。 我可以使用這樣的代碼來驗證用戶名和密碼。

using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
  bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}

事實上,這就是我從Active Directory方面需要的一切。 所以我可以使用此代碼創建一些AuthorizationFilter,但這意味着用戶名和密碼必須在每個請求中。 我只想發送一次用戶名和密碼,然后使用一些令牌進行授權。 所以在我的服務器端應用程序中應該有一些令牌提供程序。

我從頭開始構建這個應用程序,所以我可以使用最新的.net技術。 我發現有一些Owin中間件正在處理令牌,cookie和OAuth。 這有什么可以幫助我嗎?

當我在尋找完全不同的東西時,我在CodePlex上發現了這個令人難以置信的項目: https//conularapp.codeplex.com/這正是我想要的。

更新:

這個應用程序對我有用的部分是DomainUserLoginProvider

public class DomanUserLoginProvider : ILoginProvider
{
    public bool ValidateCredentials(string userName, string password, out ClaimsIdentity identity)
    {
        using (var pc = new PrincipalContext(ContextType.Domain, _domain))
        {
            bool isValid = pc.ValidateCredentials(userName, password);
            if (isValid)
            {
                identity = new ClaimsIdentity(Startup.OAuthOptions.AuthenticationType);
                identity.AddClaim(new Claim(ClaimTypes.Name, userName));
            }
            else
            {
                identity = null;
            }

            return isValid;
        }
    }

    public DomanUserLoginProvider(string domain)
    {
        _domain = domain;
    }

    private readonly string _domain;
}

LoginProvider用於AccountController的操作以驗證憑據。 此處也創建了AccessToken。

[HttpPost, Route("Token")]
public IHttpActionResult Token(LoginViewModel login)
{
    ClaimsIdentity identity;

    if (!_loginProvider.ValidateCredentials(login.UserName, login.Password, out identity))
    {
        return BadRequest("Incorrect user or password");
    }

    var ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
    var currentUtc = new SystemClock().UtcNow;
    ticket.Properties.IssuedUtc = currentUtc;
    ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));

    return Ok(new LoginAccessViewModel
    {
        UserName = login.UserName,
        AccessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket)
    });
}

最后但並非最不重要的是,將正確的中間件添加到Owin管道。

public partial class Startup
{
    static Startup()
    {
        OAuthOptions = new OAuthAuthorizationServerOptions();
    }

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    public static void ConfigureAuth(IAppBuilder app)
    {
        app.UseOAuthBearerTokens(OAuthOptions);
    }
}

在客戶端,您只需將帶有憑據的請求發送到AccountController的令牌操作,您將獲得身份驗證令牌。 將此令牌保存在瀏覽器中(“記住我”功能)並設置Angular的$ http服務以將令牌附加到每個請求。

services.factory('$auth', ['$q', '$http', '$path', function ($q, $http, $path) {       
    var tokenUrl = $path('api/Account/Token');

    function setupAuth(accessToken, remember) {
        var header = 'Bearer ' + accessToken;
        delete $http.defaults.headers.common['Authorization'];
        $http.defaults.headers.common['Authorization'] = header;
        sessionStorage['accessToken'] = accessToken;
        if (remember) {
            localStorage['accessToken'] = accessToken;
        }
        return header;
    }

    var self = {};

    self.login = function(user, passw, rememberMe) {
        var deferred = $q.defer();
        $http.post(tokenUrl, { userName: user, password: passw })
            .success(function (data) {
                var header = setupAuth(data.accessToken, rememberMe);
                deferred.resolve({
                    userName: data.userName,
                    Authorization: header
                });
            })
            .error(function() {
                deferred.reject();
            });

        return deferred.promise;
    };

    return self;
}]);

當然,OAuth是一種可行的方式,但為什么不考慮舊的良好的表單身份驗證? 它完全適合場景 - 使用自定義提供程序,您可以在AD中對用戶進行身份驗證,然后所有連續的客戶端請求都帶有可用於驗證服務器調用的身份驗證cookie。

此場景中的Forms cookie扮演您想到的“令牌”的角色。

暫無
暫無

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

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